Java的一种强大机制——反射
介绍
-
反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法,属性,构造方法等成员
-
简单的说反射就是调用 、构造方法、普通方法、属性字段的另外一种方式。最终的调用效果和普通调用方式是一样的
有关反射的四个API
-
java.lang.Class
-
java.lang.reflect.Constructor
-
java.lang.reflect.Method
-
java.lang.reflect.Field
三种创建Class对象的方法 -
类名.class
-
对象.getClass()
-
Class.forName(“类的全限定类名”) 包名+类名
获取Constructor对象方法举例 -
getConstructor(Class… argTypes)
返回值:public类型的Constructor,返回的是public的,获取的也必须是public修饰的构造方法
参数:构造方法的参数类型,设User的一个构造方法为:
public User(String name) {this.name=name}
这里的参数类型就是String.class
注意:如果定义的是int类型就必须用int.class 不能用Integer.class ,多个参数用逗号隔开
-
getDeclaredConstructor(Class… argTypes)
返回值:任意类型的Constructor,可以获取任意修饰类型的构造方法如private
参数同上
注意:如果要反射操作无权限的(private修饰的)Constructor,必须提前设置允许暴力反射:
constructor.setAccessible(true)扩展: Constructor对象提供了一个获取对象实例的方法:
newInstance(Object… argValues)
参数:构造方法的参数值
返回值:类实例对象Object
反射调用普通方法 -
getMethod(String name, Class… argTypes)
参数:name:方法名,argTypes:方法的参数类型
返回值:public类型的Method -
getDeclaredMethod(String name, Class… argTypes)
参数:name:方法名称,argTypes:方法的参数类型
返回值:任意类型的Method
扩展:Method对象提供了方法:
invoke(Object target, Object… values)
参数:target:执行哪个对象的方法,values:方法的实参值
返回值:方法返回值
注意:如果要反射操作无权限的Method,必须提前设置允许暴力反射:
method.setAccessible(true)
反射操作属性(字段) -
getField(name)
参数:属性字段的名称
返回值:public类型Field -
getDeclaredField(name)
参数:属性字段的名称
返回值:任意类型Field
注意:如果要反射操作无权限的Field,必须提前设置允许暴力反射:
field.setAccessible(true)
以上只是API简单的介绍,具体有哪些方法可以查看API
反射与封装性
封装是静态加载类:编译时刻加载类,表示在编译时刻就需要加载所有的可能使用到的类。
反射是动态加载类:jvm运行时刻加载类。
简单举个栗子:使用new创建一个对象,我们在运行程序的时候,该对象的类必须存在,否则会产生编译错误,这种方式就是静态加载类。如果使用了Object obj = Class.forName(“xxx”)来创建实例,只有在运行时候,该类不存在时,才会抛出异常,这种方式就是动态加载类。
反射是框架的灵魂,突出了OOP(面向对象)语言中一个重要的编程思想:万事万物皆对象。