Java反射机制
# ReviewDay4## 反射
### 反射机制
- 反射机制允许程序执行期间借助 Reflection API 获得任何类的内部信息
- 加载完类之后,堆中就会产生一个Class类型对象一个类只有一个Class对象(包含了类的完整结构信息)
- 原理示意图
> 1.在运行时判断任意一个对象所属的类
>
> 2.在运行时构造任意一个类的对象
>
> 3.在运行时得到任意一个类所具有的成员变量和方法
>
> 4.在运行时调用任意一个对象的成员变量和方法
>
> 5.生成动态代{过}{滤}理
### 反射相关类
- java.lang.Class
> *代表一个类,Class对象表示在某个类加载后在堆中的对象*
- java.lang.reflect.Method
> *代表类的成员变量,Method对象表示某个类的方法*
- java.lang.reflect.Field
> *代表类的成员变量,Field对象表示某个类的成员变量*
- java.lang.reflect.Constructor
> *代表类的构造方法,Constructor对象表示构造器*
### Class 类
- 1.Class类也是类,也继承了Object类
- 2.Class类对象由**系统创建**(不是new出来的)
- 3.同一个类的Class类对象,在内存中只有一份,因为类只加载一次
- 4.每个类的实例都知道自己由哪个Class实例生成的
- 5.通过Class对象可以得到一个类的完整结构
- 6.Class对象存放于**堆**中
- 7.类的**字节码**二进制数据存放于**方法区**(包括方法名,变量名, 方法代码,访问权限)
### 获取Class类对象
- 已知一个类的全类名,且该类在类路径下,可以通过Class类的静态方法forName()获取
> ```eg```: Class cls1 = Class.forName("java.lang.Cat");
>
> ```应用```: 多用于配置文件,读取类全路径,加载类
- 已知具体类,通过类的class方法获取(最安全可靠,性能最高)
> ```eg```: Class cls2 = Cat.class;
>
> ```应用```: 多用于参数传递,比如通过反射达到对应构造器对象
- 已知某个类的实例,通过该实力的getClass方法获取Class对象
> ```eg```: Class cls3 = cat.getClass(); //运行类型
>
> ```应用```:通过创建好的对象获取Class对象
- 其他方式
> ClassLoader cl = 对象.getClass().getClassLoader();
>
> Class cls4 = cl.loadClass("类的全类名");
- 基本数据
> Class cls = 基本数据类型.class
- 包装类,可以通过.TYPE得到Class类对象
> Class cls = 包装类.TYPE
### 类加载
#### 1.加载方式
- 静态加载: 编译时加载相关的类(依赖性强)
- 动态加载: 运行时再加载需要的类(降低依赖性)
#### 2.类加载时机
- 创建对象时(new) //静态加载
- 当子类被加载时,父类也会加载 //静态加载
- 调用类的静态成员时 //静态加载
- 反射 //动态加载
#### 3.类加载过程
- 过程图
- 各阶段任务
- 加载阶段:JVM将字节码从不同数据源转化为二进制字节流加载到内存中,并生成Class类对象
- 连接阶段:验证```验证Class文件的字节流信息是否符合虚拟机要求```->准备```对静态变量分配内存并默认初始化(默认初始值,如0,0L,null, false```->解析```将常量池中的符号引用替换为直接引用```
- 初始化节点:执行类中定义的Java程序代码(静态变量赋值和静态代码块) 流程图不错 赞一个! 楼主厉害,流程图很清晰的结构。 厉害啦,赞一个 学习了,感谢大佬分享
页:
[1]