`
luoxiaohui_java
  • 浏览: 12868 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java反射机制学习(一)

阅读更多

      鉴于之前用Java反射机制只停留在解决问题层次,并未深入去了解其中的内涵,所以忘记也比较快。最近时间比较富余,能静下心来研究一下,只做个人总结学习之用,如有高手遇见,仅作抛砖引玉之用。

      

      首先来了解一下何为Java反射机制,请看下面一段文字:

 

 

     反射(reflection)的概念是由Smith在1982年首次提出的主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。1Java反射机制原理反射是Java被认为是动态语言的一个非常重要的特性,它允许动态发现和绑定类、方法、字段,以及所有其他的由语言所产生的元素。也就是说,这类应用通过采用某种机制来实现对自己行为的描述和监测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。当前主流的计算反射原型系统大多是建立在元对象协议的体系结构上,Java语言的反射机制也是建立在这种体系结构之上。在Java反射系统中,有一部分程序用来描述和计算问题域,称之为应用程序(application program),而有一部分程序专门用来表达和控制应用程序的计算行为,称之为元程序(metaprogram),即程序的程序。元程序在整个系统所处的层次称为元级(meta-level)...摘自软件导刊2008年11期

 

用自己的话说,Java在被加载到JVM解释执行时是不可修改的,而反射机制的出现使得这种修改成为了可能,可以利用反射完成对象的赋值,方法的调用,动态代理类实现方法的调用等。

废话少说,首先要对反射中涉及到的接口和类有个大致的了解,才能做到心里有数。下面是从JDK帮助文档中摘抄下来的。

 

 

Java反射类都放在java.lang.reflect包下。

1)接口列表(仅举常用的):
InvocationHandler   代理实例的调用处理程序实现的接口。已知实现类   java.beans.EventHandler,

              java.rmi.server.RemoteObjectInvocationHandler
              主要方法: Object  invoke(Object proxy,Method method,Object [] args);
                              proxy  在其上调用方法的代理实例
                              method 对应于在代理实例上调用的接口方法的Method实例。
                              args  包含传入代理实例上方法调用的参数值的对象数组。
Member  成员是一种接口,反映有关单个成员(字段或方法)或构造方法的标识信息。
              已知实现java.lang.reflect.Cunstructor,java.lang.reflect.Field,java.lang.reflect.Method
              主要方法:
              int  getName(); 获取成员变量的名称
              String getModifiers(); 获取成员变量的修饰符。
ParameterizedType  表示参数化类型,如 Collection<String>。 
             主要方法:
             Type[] getActualTypeArguments()  返回表示此类型实际类型参数的 Type 对象的数组。

AccessibleObject

             是Field,Method和Constructor对象的基类。他提供了将反射的对象标记为在使用时取消默认Java语言访问控制检查的能力(依靠setAccessible(true)方法来实现)。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时 候,会执行访问检查。
             主要方法:
             Annotation[] getAnnotations()返回此元素上存在的注释。

             Annotation[] getDeclaredAnnotations()  返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

             setAccessible(AccessibleObject[] array, boolean flag)

                    使用单一安全性检查(为了提高效率)为一组对象设置 accessible 标志的便捷方法。
             setAccessible(boolean flag) 为单一对象设置accessible标志。
Filed      提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例

            字段 终极类,继承了AccessibleObject,实现了Member接口。
            setInt(),setLong,setBoolean()等方法实现动态给Filed赋值。

Method 

             提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包 

            括抽象方法)终极类,继承了AccessibleObject,实现了Member、ParamterizedType接口。
            主要方法:
            Annotation[]  getAnnotations()
            Annotation[]  getDeclaredAnnotations()
            Type[]  getGenericParameterTypes() 
            按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。
            Class<?>[]  getParameterTypes() 
            按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。 

Cunstructor    提供关于类的单个构造方法的信息以及对它的访问权限。

 Proxy            提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

 

例如:创建某一接口 Foo 的代理:


       Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),


                                          new Class[] { Foo.class },


                                          handler);

  

 

 本章节暂时记录到这,下一节继续。

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics