java class加载过程
Class文件执行
加载 - 连接 - 初始化
一.Loading
ClassLoader(类加载器)将资源(包括class、文件、来自网络的流)加载到内存
加载到内存会生成java内置的Class对象
1、ClassLoader的等级加载机制 :
-
BootstrapClassLoader(启动类加载器):
加载JVM运行时所需的核心类和jar包 -主要在jre/lib/下
C:\Program Files\Java\jre1.8.0_91\lib\resources.jar; C:\Program Files\Java\jre1.8.0_91\lib\rt.jar; C:\Program Files\Java\jre1.8.0_91\lib\sunrsasign.jar; C:\Program Files\Java\jre1.8.0_91\lib\jsse.jar; C:\Program Files\Java\jre1.8.0_91\lib\jce.jar; C:\Program Files\Java\jre1.8.0_91\lib\charsets.jar; C:\Program Files\Java\jre1.8.0_91\lib\jfr.jar; C:\Program Files\Java\jre1.8.0_91\classes
-
ExtClassLoader(扩展累加载器)
扩展类和jar加载 - jre\lib\ext\xxx.jar
-
AppClassLoader:
加载其余jar包和自定义类加载自定义的class
图来源:https://blog.csdn.net/codeyanbao/article/details/82875064
-
🐳 双亲委派机制:
分层加载保证核心类库的安全,classLoader都会有个getParent()方法指向自己的对象是由哪个classLoader(父加载器)加载到内存中的,防止运行时上层classLoader二次加载
-
👦自定义类加载器
继承ClassLoader抽象类,
重写findClass方法(得到文件IO)
中调用defineClass方法(将二进制转成Class对象)并返回Class对象 -
🍚LazyLoading的五种情况
-
new、getstatic、putstatic、invokestatic 指令,访问final变量除外!
-
java.lang.reflect对类进行反射调用时
-
初始化子类时,先初始化父类
-
虚拟机启动时,被执行的主类会被初始化
-
动态语言支持java.lang.invoke.MethodHandle解析结果为REF_getstatic REF_putstatic、 REF_invokestatic的方法句柄是,该类必须初始化
-
二.Linking
1.Vertification
验证文件是否符合jvm规定
2.Preparation
静态变量 赋值为 默认值 static String s;
final成员变量(基础类型) 赋值为 默认值 final int a;
3.Resolution
☎️将类、方法、属性等符号解析为直接引用,
✌️常量池中的各种符号解析为指针、偏移量等内存地址的直接引用
三.Initializing
🆒静态成员变量 赋值为 初始值 static String s="ss";
🌔调用类构造器方法(静态代码块)
四、实例化🐱
1.申请对象内存空间
2.成员变量 赋值为 默认值
3.调用对象构造方法
-
1)调用父类构造方法
-
2)调用变量顺序赋初始值
-
3)执行构造方法