应用背景
假设我们有一个可以运行的程序,我们想要扩展它的功能,可是我们不能获得他的源代码。该怎么办呢?程序对外提供了一个接口,我们可以提供一个实现该接口的扩展功能类,那么要怎么让程序使用这个类呢?这就用到了java反射机制。
应用程序会对外提供一个配置文件,我们把这个扩展功能类的类名写到配置文件中,则应用程序会自动读取配置文件,并找到相应的类,执行扩展功能。
过程就是:加载类;创建类对象;调用类中的内容。
而这个过程就是java反射机制所做的内容。
Java反射机制的好处就是可以提供程序的扩展性。
import java.lang.reflect.*;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
accessField();
}
private static void accessField() throws Exception {
//先获取Class对象
String className = "reflect.Person";
Class clazz = Class.forName(className);
//获取字段
//获取公有,私有,保护,包访问字段,不可访问继承的字段
Field field = clazz.getDeclaredField("age");
System.out.println(field);
//给字段设置值
Object obj = clazz.newInstance();
field.set(obj, 19);
System.out.println(field.get(obj));
}
}/*Output:
int reflect.Person.age
new Person()
19
*/
上例是获得成员变量,即字段的方法。
获取字段的方法有getMethods():获取公有和父类中的方法
getDeclaredMethods():获取本类中,包括私有的方法
getMethod(String methodName,para):获取公有和父类中的方法,传入方法名称和参数
getDeclaredMethods(String methodName,para):获取本类中,包括私有的指定方法名称和传入参数的方法
获取方法对象invoke(Object obj,para)
注意:如果获取的方法是私有的话,不能访问它,解决办法是:AccessibleObject类中有setAccessible(boolean flag)
方法,设为true时,可以取消访问权限,对私有方法进行访问。但也不建议这么做。
访问静态方法:
静态方法不需要创建对象,假设有一个静态的method的空参数方法。
Method method = clazz.getDeclaredMethod("method", null);
method.invoke(null, null);
这样就可以直接取出静态的方法名:method() |