反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操作Java代码的程序。这项功能被大量用在JavaBean中,他是Java组件的体系结构。在设计或运行中添加新类时,能够快速地应用开发工具动态地查询新添类的能力。
能够分析类能力的程序称为反射。反射机制可以用来:
- 在运行时分析类的能力
- 在运行时查看对象,例如编写一个toString方法供所有类使用
- 实现通用的数组操作代码
- 利用Method对象
反射功能强大,内容复杂。使用他的主要人员是工具构造者,不是应用程序员。
在程序运行期间,Java运行时始终为所有对象维护一个被称为运行时的类型标识。这个信息跟踪每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。
然而,可以通过专门的java 类访问这些信息。保存这些信息的类称为Class。Object类的getClass()方法将会返回一个Class类型实例。
如同一个Employee对象表示一个特定的员工一样,一个Class对象将表示一个特定的类的属性。最常用的是getName方法,返回类的名字。
在 java.lang.reflect 包中有三个类Field,Method,Constructor分别用于描述类的域、方法和构造器。这三个类都有一个叫做getName的方法,用来返回项目的名称。 Field类有一个getType方法,用来返回描述域所属类型的class对象。Method和Constructor类有能够报告参数类型的方法,Method类还有一个能够报告返回类型的方法。这三个类还有一个getModifier的方法,他将返回一个整数值,用不同的位开关描述public和static这样的修饰符的使用情况。
Class类中的getFields,getMethods和getConstructors方法将分别返回类提供的public域、方法、构造器数组,其中包括超类的公有成员。Class类的getDeclaredFields,getDeclaredMethods和getDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包含私有和受保护的成员,但不包括超类的成员。
package ReflectTest;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws NoSuchMethodException,IllegalAccessException, SecurityException,NoSuchFieldException, InvocationTargetException {
Employee employee = new Employee("tn","001","dev");
Class employCl = employee.getClass();//获得employee的class对象
Field f = employCl.getField("name");//获得employee对象的域
Object name = f.get(employee).toString();//域.get(实例对象名)能够获得实例中的这个域(属性)的值
System.out.println(name);
Method method1 = employCl.getMethod("getName");//获取employee对象的getName方法
System.out.println(method1.toString());//将方法名转成string类型输出
String m2 = method1.invoke(employee).toString();//方法名通过invoke(实例名)能够执行
System.out.println(m2);
}
}
package ReflectTest;
public class Employee {
public String name;
private String id;
private String dep;
public Employee(String name, String id, String dep){
this.name = name;
this.id = id;
this.dep = dep;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDep() {
return dep;
}
public void setDep(String dep) {
this.dep = dep;
}
public Employee(){
System.out.println("初始化Employee");
}
}