反射
反射的概念


public class Person {
private String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private Person(String name) {
this.name = name;
}
private String show(String s) {
return "调用私有方法:" + s;
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@Test
public void Test() throws Exception{
Class<Person> clazz = Person.class;
//调用空参构造器
Person p = clazz.newInstance();
//通过反射,创建Person类的对象
Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
Person p1 = constructor.newInstance("张三", 20);
System.out.println(p1);//Person{name='张三', age=20}
//通过反射,调用对象指定的属性、方法
//设置属性
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"里斯");
System.out.println(p1);//Person{name='里斯', age=20}
//调用私有方法
Method show = clazz.getDeclaredMethod("show", String.class);
show.setAccessible(true);
String str = (String) show.invoke(p1, "私有方法");
System.out.println(str);
}
关于Java.lang.Class类的理解
1.类的加载过程:
程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class),使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程称类的加载。加载到内存中的类,成为运行时类,此运行时类,就作为Class的一个实例。
2.Class的实例对应着一个运行时类。
3.加载到内存中的运行时类,会缓存一定的时间,在此时间之内,可以通过不同的方式来获取此运行时类。
public class ReflectTest {
@Test
public void test2() throws ClassNotFoundException {
//方式一:调用运行时类的属性:.class
Class clazz1 = Person.class;
//方式二:通过运行时类的对象,调用getClass()
Person p1 = new Person("aa",10);
Class clazz2 = p1.getClass();
//方式三:调用Class的静态方法:forName(String classPath) 全类名
Class clazz3 = Class.forName("mianxiangduixiang.java8.Person");
//方式四:使用类的加载器ClassLoader
ClassLoader classLoader = ReflectTest.class.getClassLoader();
Class clazz4 = classLoader.loadClass("mianxiangduixiang.java8.Person");
System.out.println(clazz1==clazz2);//true
System.out.println(clazz1==clazz3);//true
System.out.println(clazz1==clazz4);//true
}
}

浙公网安备 33010602011771号