1.概述

image.png
通过反射,我们可以调用使用对象无法调用的私有化构造器,变量,方法。
image.png

2. 理解Class类并获取Class实例

  1. 共有三种方式获取类的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的理解

  1. 类对象被创建时,会初始化类的相关属性,当静态方法用sychornized修饰时,会使用类对象作为锁。

4.创建运行时类的对象

5.获取运行时类的完整结构

6.调用运行时类的指定结构

7. 反射的应用:动态代理