Java 反射机制
更多内容,前往 IT-BLOG
反射(Reflection)被视为动态语言的关键,反射机制允许程序在执行期间借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。如果仅对设计应用程序感兴趣,而对构造工具不感兴趣,就没有学习的必要。
一、反射机制提供的功能(什么时候会用到反射)
【1】在运行时判断任意一个对象所属的类。
【2】在运行时构造任意一个类的对象。
【3】在运行时判断任意一个类所具有的成员变量和方法。
【4】在运行时调用任意一个对象的成员变量和方法。
【5】生成动态代理。
二、Class 类
在程序运行期间,Java 运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。保存这些信息的类被称为 Class,Object 类中的 getClass() 方法将会返回一个 Class 类型的实例。具体细节说明如下:
三、通过反射调用类中指定的方法和属性(重要)
在 java.lang.reflect 包中有三个类 Field(域)、Method(方法)、Constructor(构造器)。这三个类都有一个叫做 getName 方法,用来返回项目的名称。Filed 类有一个 getType 方法,用来返回描述域所属类型的 Class 对象。Method 与 Constructor 类有能够报告参数的方法【getParameterTypes】,Method 类还有一个可以报告返回类型的方法【getReturnType()】。这三个类还有一个 getModifiers 方法,返回一个整数值,用不同的位开关描述 public 和 private等修饰符。可以通过 Modifier 类的静态方法将整数转化为 public 等。Class 类的 getDeclareFields、getDeclareMethods 和 getDeclaredConstructors 方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受保护的成员,但不包括父类成员。
get 方法有一个需要解决的问题,name 域是一个 String 时,我们将它当做 Object 返回没有什么问题。但是假定我们想要查看 salary 域。它属于 double 类型,而 java 中数据值类型不是对象。可以使用 Field 类中的 getDouble 方法,也可以调用 get 方法,此时,反射机制将自动地将这个域值打包到相应的对象包装器中,这里打包成 Double。
五、应用
【1】JDK 的动态代理:链接
【2】Spring 的 AOP 面向切面编程:链接