原文出处:www.programcreek.com/2013/09/java-reflection-tutorial/
什么是反射?为什么它有用?怎么使用它?
1. 反射是什么?
“反射一般用于需要动态对正运行在java虚拟机中的应用的行为进行检查和修正的程序中。" 这个概念容易和“反省”(introspection)混淆。下面是它们在Wiki上面的定义:
- 反省(introspection)是指在程序运行时检查一个对象的类型和性质的能力。
- 反射(Reflection is)是指程序在运行是检查和修改一个对象的结构和行为的能力。
从它们的定义可以看出,反省(introspection)是反射的一部分。一些编程语言支持反省(introspection),但是不支持反射。例如 C++。
反省(introspection)例子:instanceof 操作判断一个对象是否属于某个特定的类
if(obj instanceof Dog){
Dog d = (Dog)obj;
d.bark();
}
反射例子: Class.forName()方法返回与给定的名字与之相关的类或者对象的一个class对象,并对其进行初始化。
// with reflection
Class<?> c = Class.forName("classpath.and.classname");
Object dog = c.newInstance();
Method m = c.getDeclaredMethod("bark", new Class<?>[0]);
m.invoke(dog);
在Java中,反射更像是反省,因为不能改变一个对象的结构。一些API只是改变了对它的属性和方法的访问标记,而不是改变它的结构。
2.我们为什么需要反射?
反射的作用:
- 在运行期间检查一个对象的类型
- 在运行期间构造一个类的对象
- 在运行期间检查类的字段与方法
- 在运行期间调用对象方法
- 改变构造方法、普通方法、字段的访问标记
- 等等
反射是框架常见共方法
例如,Junit 使用反射