简介:
User java.lang.Class 所有的类都是 Class 类的对象
类加载: 由. java 源文件编译生成. class 二进制字节码文件, 当运行时, 首先 Java 虚拟机会将本地 / 网络阐传输. class 文件加载到内存当中, 那么加载的过程就叫做类加载
一. 类加载的过程
加载过程: 将. class 文件通过 IO 流的方式加载到内存当中
1. 将. class 文件字节码内容加载到内存当中
2. 先会将静态数据转换成方法区中的运行的数据结构
3. 在堆内存当中生成一个代表这个类的 Class 对象, 这个 Class 类的对象就是作为方法区数据访问的入口 Class.forName(com.wdksoft.User);
链接过程:
1. 验证阶段: 验证字节码文件的准确性, 包含文件格式, 元数据, 符号引用, 字节码等等
2. 准备阶段: 给类中的静态变量分配内存, 并赋予初始值
3. 解析阶段: 将虚拟机常量池的符号引用替换成字节引用的过程
初始化过程: 初始化过程就会对类中的静态变量初始化为指定的值, 执行静态代码块, 执行构造器
使用过程
卸载过程
- public class ClassLoaderTest {
- private static Integer i=50;
- static {
- System.out.println("静态代码块");
- i=70;
- }
- public ClassLoaderTest(){
- System.out.println(i);
- System.out.println("类中构造函数");
- }
- public static void main(String[] args) {
- ClassLoaderTest test = new ClassLoaderTest();
- }
- }
二. 类加载器的种类
1. 引导类加载器: 负责加载 JRE 核心类库, jre 包下 rt.jar,charsets.jar 等, C++ 语言编写, 无法直接访问
2. 扩展类加载器 ExtClassLoader: 负责加载 JRE 扩展目录 ext 中的 jar 包
3. 系统类加载器 AppClassLoader: 负责加载 classPath 路径下的类包
4. 自定义类记载器: 负责加载用户自定义下的类包
实现自定义类加载器: extends ClassLoader, 重写 loadClass 方法进行类的加载
public class Test { // 获取 String 类的类加载器 System.out.println(String.class.getClassLoader()); System. out . println(DESKeyFactory. class. getClassLoader() . getClass() . getName()); // 获取当前类的类加载器 System. out . println(Test.class. getClassLoader(). getClass() . getName()); // 获取系统类加载器 System. out . println(ClassLoader . getSys temClassLoader() . getclass() . getName(); }
来源: http://www.bubuko.com/infodetail-3458263.html