1 Java反射机制概述
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
2 Java反射测试示例
package captain;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
//反射,演示反射操作一个类的无参构造函数、有参构造函数、属性、方法。
public class ReflectDemo {
//利用反射操作无参构造函数
@Test
public void test1() throws Exception {
// 获取一个类的Class对象的三种方式。
// Class c = Person.class;
// Class c2 = new Person().getClass();
Class c3 = Class.forName("captain.Teacher");
/*
* 通过Class对象的newInstance方法实例化被反射类,返回值类型是Object。 实际上是调用了被反射类的无参构造方法。
*/
Teacher t = (Teacher) c3.newInstance();
t.setName("zhangsan");
System.out.println(t.getName());
}
//利用反射操作有参构造函数
@Test
public void test2() throws Exception {
Class c3 = Class.forName("captain.Teacher");
//获取指定的有参构造函数对象
Constructor cs= c3.getConstructor(String.class,String.class);
Teacher t = (Teacher) cs.newInstance("zhangsan","001");
System.out.println(t.getName()+" "+t.getId());
}
//利用反射操作属性(域)
@Test
public void test3() throws Exception {
Class c3 = Class.forName("captain.Teacher");
Teacher t = (Teacher) c3.newInstance();
//获取指定的类中声明属性
Field f = c3.getDeclaredField("name");
//由于属性name为Teacher类私有的,所以要设置可访问。
f.setAccessible(true);
//设置类的一个实例t的name属性的值为"zhangsan"。
f.set(t, "zhangsan");
System.out.println(t.getName());
}
//利用反射操作一般方法
@Test
public void test4() throws Exception {
Class c3 = Class.forName("captain.Teacher");
Teacher t = (Teacher) c3.newInstance();
//获取指定的类中声明一般方法。将方法名、方法参数类型作为参数,这样可以确定唯一的一个方法对象。
Method m = c3.getDeclaredMethod("setId", String.class);
/*
* 执行t对象的setId方法,传入参数值为"001"。
* 注意1:若setId方法为私有的,则也要先设置可访问,即m.setAccessible(true);
* 注意2:若setId方法为静态的,则不需要类的一个实例,且改为m.invoke(null, "001");
*/
m.invoke(t, "001");
System.out.println(t.getId());
}
}
//Teacher类
class Teacher {
private String name;
private String id;
public Teacher() {
}
public Teacher(String name, String id) {
this.name = name;
this.id = id;
}
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;
}
}