CSDN博客

img ELuYouNi

java反射机制

发表于2008/9/28 20:59:00  813人阅读

分类: Java

    详细实例下载:http://d.download.csdn.net/down/656222/eluyouni

一  反射的概念 :
     (1) JAVA 反射机制(Java Reflection) 是Java 被视为动态(或准动态)语言的一个关键性质。
        这个机制允许程序在执行期透过Reflection API 取得任何一个已知名称的class 的内部资讯,
        对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;
        这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.

 

     (2) Java中,反射是一种强大的工具。它使您能够创建灵活的代码,

          这些代码可以在运行时装配,无需在组件之间进行源代表链接。
         反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中

         的类的内部信息,而不是源代码中选定的类协作的代码。
         这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高
    
     (3)Java在真正需要使用一个类的时候才会加以加载,而不是在程序启动时就加载所有的类。
      大多数使用者都只使用到应用程序的部分资源,在需要某些功能时才加载某些资源,
      可以让系统的资源运用更有效率(Java本身就是为了资源有限的小型设备而设计的,这样的考虑是必然的。

    

     (4)反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
       这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。

       它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
       其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。

       最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。

 

     (5)反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,
      但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。在计算机科学领域,反射是指一类应用,
      它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)    
      和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
      可以看出,同一般的反射概念相比,计算机科学领域的反射不单单指反射本身,还包括对反射结果所采取的措施。
      所有采用反射机制的系统(即反射系统)都希望使系统的实现更开放。可以说,实现了反射机制的系统都具有开放性,
      但具有开放性的系统并不一定采用了反射机制,开放性是反射系统的必要条件。一般来说,
      反射系统除了满足开放性条件外还必须满足原因连接(Causally-connected)。
      所谓原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况,反之亦然。
      开放性和原因连接是反射系统的两大基本要素。

------------------------------------------------------------------------------------------- 

二 Java 反射机制主要提供了以下功能:
    1.在运行时判断任意一个对象所属的类;
    2.在运行时构造任意一个类的对象;
    3.在运行时判断任意一个类所具有的成员变量和方法;
    4.在运行时调用任意一个对象的方法;
    5.生成动态代理
--------------------------------------------------------------------------------------------

三  JDK中,实现反射机制的类在java.lang.reflect包中。

    1. Class 类:代表一个类
       它有以下方法
     (1) getName():
            获得类的完整名字。
     (2) getFields():
            获得类的public类型的属性。 
     (3) getDeclaredFields():
             获得类的所有属性,包括public、protected、默认和private访问级别的属性。 
     (4) getMethods():
             获得类的public类型的方法。 
     (5) getDeclaredMethods():
              获得类的所有方法。
     (6) * getMethod(String name, Class[] parameterTypes):
                获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。 
    (7) * getConstrutors():
               获得类的public类型的构造方法。
     (8) * getConstrutor(Class[] parameterTypes):
                获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。 
     (9) newInstance():
              通过类的不带参数的构造方法创建这个类的一个对象。

    2. Field 类:代表类的成员变量(类的属性)。

    3. Method类:代表类的方法。
        Method类的invoke(Object obj,Object args[])方法用于动态执行一个对象的特定方法,
        它的第一个 obj 参数指定具有该方法的对象,第二个args 参数指定向该方法传递的参数。

    4. Constructor类:代表类的构造方法。

    5. Array 类:提供了动态创建数组,以及访问数组元素的静态方法。
-----------------------------------------------------------------------------------------------------------

四 代理模式
    
   1. 代理模式是常用的Java设计模式,它的特征是代理类与委托类有同样的接口,
      代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
      代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,
      代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

   2. 按照代理类的创建时期,代理类可分为两种。
     静态代理类:
     由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了      
     动态代理类:
     在程序运行时,运用反射机制动态创建而成。

       (1) 与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由 Java反射机制动态生成,
        无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,
         因为 Java 反射机制可以生成任意类型的动态代理类。
         java.lang.reflect包中的Proxy类和InvocationHandler接口提供了生成动态理类的能力。

        (2)由Proxy类的静态方法创建的动态代理类具有以下特点: 
         1 动态代理类是public、final和非抽象类型的; 
         2 动态代理类继承了java.lang.reflect.Proxy类; 
         3 动态代理类的名字以“$Proxy”开头;
         4 动态代理类实现getProxyClass()和newProxyInstance()方法中参数interfaces指定的所有接口;  
        5 Proxy 类的 isProxyClass(Class<?> cl)静态方法可用来判断参数指定的类是否为动态代理类。

             只有通过Proxy类创建的类才是动态代理类;
          6 动态代理类都具有一个 public 类型的构造方法,该构造方法有一个InvocationHandler类型的参数。
             由Proxy类的静态方法创建的动态代理类的实例具有以下特点: 
          7 假定变量 foo 是一个动态代理类的实例,并且这个动态代理类实现了 Foo 接口,

                  那么“foo instanceof Foo”的值为true。
                  把变量foo强制转换为Foo类型是合法的:
                   如    (Foo) foo
            8 每个动态代理类实例都和一个 InvocationHandler 实例关联。
                   Proxy 类的getInvocationHandler(Object proxy)静态方法返回与参数proxy指定的

                  代理类实例所关联的InvocationHandler对象。
             9 假定Foo接口有一个amethod()方法,那么当程序调用动态代理类实例foo的amethod()方法时,
                     该方法会调用与它关联的InvocationHandler对象的invoke()方法。

        (3)动态类好处 可以 在远程方法调用中运用代理类
             如果使用静态代理方式,那么对于每一个需要代理的类,都要手工编写静态代理类的源代码;

            如果使用动态代理方式,那么只要编写一个动                                  

             态代理工厂类,它就能自动创建各种类型的动态代理类,

            从而大大简化了编程,并且提高了软件系统的可扩展性和可维护性。


五 后序
      开发的时候有时候会碰到这样的情况,我们在写程序的时候并不知道需要调用某个对象的哪个方法,
      只有程序运行后,我们才能够知道。或许我们需要根据客户端传过来的某个String参

      数的值来判断我们应该执行哪个方法。在这种情况下JAVA的反射执行就可以帮上忙了。
      Spring的核心,完全是靠反射机制读取XML文件并生成所需的组件。
      其他的大量Web框架也都是如此。而且反射机制是java相对于C++真正多出来的部分


 
 

 

 

0 0

相关博文

我的热门文章

img
取 消
img