反射原理以及反射的应用
网上关于反射原理的有很多,首先讲一下反射的定义。
定义:在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
既然是针对运行状态的类,知道其所有属性和方法,那么我们就要知道类里面有什么?
类中包含:成员变量、构造方法、成员方法
我们学习反射就得知道我们为什么学习反射?学习反射有什么好处?
如果我们要调用一个类,原来最基本的方法是new 一个对象,将类实力化,然后在调用它的属性和方法。那么,如果我们需要在这个地方调用其他的类,就必须再重新new一下其他的类。如果我们的项目比较大的话,改动一下类就必须重启服务,是一件很麻烦的事情。
如果我们学习了反射,那么我们就可以动态的,不需要改动已经写好的class文件,就可以运行新的对象。
话不多说,关于反射获取class类的方式有三种:
1、Class.forName("对象地址")
2、对象.class
3、new 对象.getClass()
获取类中的属性、构造方法、成员方法
1、属性
Field field[] = a.getFields(); //获取所有public权限的属性
Field field = a.getField();
Field field[] = a.getDeclaredFields(); //获取所有属性,不管什么权限
Field field = a.getDeclaredField();
如果我们想对私有属性进行操作,则需要忽略安全访问权限
field.setAccessible(true);
2、构造方法
Constructor c[] = a.getConstructors(); //获取所有public构造方法
Constructor c = a.getConstructor();
Constructor c[] = a.getDeclaredConstructors(); //获取所有权限的构造方法
Constructor c = a.getDeclaredConstructor();
忽略安全访问权限
c.setAccessible(true);
3、成员方法
Method method = a.getMethod("方法名称"); //获取指定方法
Method method[] = a.getMethods(); //获取所有public成员方法
Method method[] = a.getDeclaredMethods(); //获取所有权限的成员方法
忽略安全访问权限
method.setAccessible(true);
案例
反射的应用,通过配置文件实现对程序加载类的控制。反射机制对于框架的使用尤为重要。
首先新建一个配置文件:pro.properties ,其中添加配置,比如类名、方法
className=test2.Person
methodName=eat
在调用的文件中,
public class TestFS {
public static void main(String[] args) throws Exception {
//1、加载配置文件
Properties properties = new Properties();
ClassLoader classLoader = TestFS.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
properties.load(resourceAsStream);
//2、获取类中定义的数据
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//3、将类加载进内存
Class aClass = Class.forName(className);
//4、创建对象
Object o = aClass.newInstance();
//5、获取方法对象
Method method = aClass.getMethod(methodName);
//6、执行
method.invoke(o);
}
}