Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法.
下面以Person类为例子,对反射进行学习
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name){
this.name=name;
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println("peorson show...name="+name);
}
public void display(String nation){
System.out.println("display... nation="+nation);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类:
public class Main {
@Test
public void test1() throws Exception {
//得到Person类的Class实例
Class<Person> clazz=Person.class;
//通过反射的方式 获取一个person对象
Person p=clazz.newInstance();
System.out.println(p);
//得到Person的属性name
Field f1=clazz.getDeclaredField("name");
//由于name的private修饰,设置成可以访问
f1.setAccessible(true);
//修改对象p的name属性为liu
f1.set(p,"liu");
System.out.println(p);
//获取对象show方法
Method m1=clazz.getMethod("show");
m1.invoke(p);
//获取对象dispaly方法,参数为String
Method m2=clazz.getMethod("display",String.class);
m2.invoke(p,"china");
}
}
打印结果:
Person{name=’null’, age=0}
Person{name=’liu’, age=0}
peorson show…name=liu
display… nation=china