反射从入门到精通(一)
1. 三个类加载器
- BootStrap类加载器【boot】
- 用于加载 jre:lib下的jar包【.class文件】
- Java提供的大多数类都在此
- Exetension类加载器【ext】
- 主要用于加载ext文件夹下的jar包【D:\Program Files\Java\jdk1.8.0_144\jre\lib\ext】
- 继承于BootStrap
- Application类加载器 【app】
- 程序中应用的jar包
- mysql,fastjson.....
2.如果要加载一个类:java.lang.String
String.java --> String.class -->加载 -->类加载器 -->【app】 -->【ext】 -->【boot】 -->【检查--ct.jar中存在String类】--> 拒接加载 -->【ext】 -->【app】 -->放弃
3.为什么加载流程这么复杂 【为了安全】
4. Car car = new Car();
- 初始化static
- 初始化属性
- 构造方法
- 创建了一个特殊的对象Class
5.Class对象
- 类加载过程中创建
- 每一个类有唯一的一个Class对象
- 类型为:Class类型
- 记录同一类的所有相关的对象的基本信息【属性、方法】
6.流程图:
7.获取Class对象的两种方式
package com.xuzhiwen.reflect; public class Test { public static void main(String[] args) throws Exception { Test test = new Test(); Class clazz_a = test.getClass(); //方法一 Class clazz_b = Test.class; //方法二 } }
8. 获取三个类加载器
package com.xuzhiwen.reflect; public class Test { public static void main(String[] args) throws Exception { Test test = new Test(); Class clazz_a = test.getClass(); //方法一 Class clazz_b = Test.class; //方法二 System.out.println(test.getClass().getClassLoader()); System.out.println(test.getClass().getClassLoader().getParent()); System.out.println(test.getClass().getClassLoader().getParent().getParent()); } }
输出结果如下:
BootStrap加载器输出结果为null,是因为它是C语言写的。