1.概述

通过反射,我们可以调用使用对象无法调用的私有化构造器,变量,方法。
2. 理解Class类并获取Class实例
- 共有三种方式获取类的Class实例,即类对象:
- Person.class
- new Person().getClass()
- Class.forName(“Person”) ``` Class clazz = Person.class; //1.通过反射创建Person类的对象 Constructor cons = claszz.getConstructor(String.class,int.class); Object obj = cons.newInstance(“Tom”,12); Person p = (Person)obj; syso(obj.toString());、 //2.通过反射调用对象指定的属性、方法 //属性 Field age = clazz.getDeclaredField(“age”); age.set(p,10); syso(p.toString()); //方法 Method show = clazz.getDeclaredMethod(“show”); show.invoke(); //通过反射调用私有属性和方法 Constructor cons1 = clazz.getDeclaredConstructor(String.class); cons1.setAccessible(true); Person p1 = (Person)cons1.newInstance(“Jerry”);
Field name = clazz.getDeclaredField(“name”); name.setAccessible(true);\ name.set(p1,”Hanmeimei”);
Method showNation = clazz.getDeclaredMethod(“showNaion”,String.class);
showNation.setAccessable(true);
//还可以接收返回值
String nation = showNation.invoke(p1,”China”);
```
程序经过javac生成.class字节码文件
然后java命令加载到内存中运行,此时在内存中的类就称为运行时类,作为Class的一个实例。
3.类的加载与ClassLoader的理解
- 类对象被创建时,会初始化类的相关属性,当静态方法用sychornized修饰时,会使用类对象作为锁。
