反射概述
- Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。
- 对于任意一个对象,如果通过反射获取到该类的字节码文件,都能够调用它的任意一个方法和属性。
- 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
获取某类字节码文件对象的3种方式:
1、源文件阶段 Person.java
Class clazz = Class.forName("全类名(包名.类名)");
作用:读取配置文件。
2、字节码阶段 Person.class
Class clazz = Person.class
作用:当做静态方法的锁对象。
3、创建对象阶段
Person p = new Person();
Class clazz = p.getClass();
作用:反向获取类的字节码文件,用来比较两个对象是否是同一个字节码对象。(注意:只要元素类型与维度一样,就是同一个class)
反射机制在实际应用中有什么作用?
在实际开发中,我们需要把一个包中的类 new 出来,但是这个包中的类总是需要变动,那么怎么办,难道总是修改 main 方法中 xxx = new xxx() 吗?这样无疑是麻烦的。而运用反射。我们可以相应的增加一个配置文件,在里面记录包中所有的类名,包中类增加时就加一个类名,删除时就删除一个类名。让main方法去读取这个配置文件中的类名,通过反射获得实例,完全不用我们去修改main方法中的代码。
反射还有什么用那?他甚至可以修改其他类中的私有属性。android开发中,我们需要改变一个私有标志位的时候,android源码并没有提供set方法,我们又不能改变源码,怎么办,反射可以完美解决这个问题。
说了这么多,那么我们的开发中,为什么不全部都用反射那?一个原因,开销,它的开销是什么昂贵的,所以尽量在最需要的地方使用反射。