反射(Reflection) 是Java 的特征之一,它允许运行中的Java 程序获取自身的信息,并且可以操作类或对象的内部属性。小编第一次用反射还是在上家公司,做客户信息存储时用的。不知诸位有没有用到反射,其实也不难。下面,小编演示一下反射的基本操作。
public class ReflectTest {
@Test
public void test1() throws Exception {
//1,获取运行时类的Class
Class<Person> aClass = Person.class;
//2,获取运行时类的实例
Person person = aClass.newInstance();
//3,获取指定public属性
Field name = aClass.getDeclaredField("name");
//5,属性赋值
name.set(person,"ppkk");
System.out.println(person);
//6,获取指定public方法
Method show = aClass.getDeclaredMethod("show");
//调用方法
show.invoke(person);
//7,获取指定private属性
Field age = aClass.getDeclaredField("age");
//private 属性,此处需要设置 setAccessible(true)
age.setAccessible(true);
age.set(person,18);
System.out.println(person);
//8,获取指定private方法
Method tell = aClass.getDeclaredMethod("tell");
//private 方法,此处需要设置 setAccessible(true) 可访问
tell.setAccessible(true);
//调用方法
tell.invoke(person);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
public String name;
private int age;
public void show() {
System.out.println("show...");
}
private void tell() {
System.out.println("tell...");
}
}
输出:
D:\jdk\jdk1.8.0_171\bin\java.exe
Person(name=ppkk, age=0)
show...
Person(name=ppkk, age=18)
tell...