Java 类加载机制0714

类加载的过程:java文件通过javac编译成class文件(二进制流文件),这种中间码被称为字节码,由JVM加载字节码,解释器和即时编译器将字节码解释 / 编译成机器码。

Java 类加载机制0714_第1张图片

 

类加载机制:从类文件---->虚拟机

虚拟机把class文件加载到内存,并对数据进行校验,转换解析和初始化,形成Class对象。

Java 类加载机制0714_第2张图片

第一步:装载 Load----查找和导入class文件

1)首先获取此类的二进制字节流

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

人话:

3)在java堆中生成一个代表这个类的 java.lang.Class对象,它封装了此类在方法区的数据结构,这样,上层的程序员就可以通过方法区的类名访问此类的数据,比如类信息,常量,静态变量等。

 Java 类加载机制0714_第3张图片Java 类加载机制0714_第4张图片

2.链接Link

2.1验证----保证了被加载类的正确性

文件格式,元数据,字节码,符号引用验证

2.2准备----为类的静态变量分配内存(JDK8之后,在堆中的元空间),并将其半初始化,赋默认值。

2.3解析----将类中的符号引用转换为直接引用

有关常量,字符串常量池等

3.初始化

对类中的静态变量,静态代码块执行初始化操作

类加载器----加载class文件

在装载阶段,是如何获取相应的二进制字节流的,需要借助类加载器完成。

Java 类加载机制0714_第5张图片

 

package leetcode0606._JVM;

public class Test02 {
    //private static int i;
    public static void main(String[] args) {
        System.out.println(new Test02().getClass().getClassLoader()); //  App ClassLoader
        System.out.println(new Test02().getClass().getClassLoader().getParent());  // ExtClassLoader
        System.out.println(new Test02().getClass().getClassLoader().getClass()); // class sun.misc.Launcher$AppClassLoader
        System.out.println(new Test02().getClass().getClassLoader().getClass().getClassLoader()); // null等价于Bootstrap ClassLoader
    }
}

Java 类加载机制0714_第6张图片

 

Java 类加载机制0714_第7张图片

 

 双亲委派模型

如何破坏双亲委派模型?

Java 类加载机制0714_第8张图片

你可能感兴趣的:(java)