加载 - 连接 - 初始化
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的方法句柄是,该类必须初始化
验证文件是否符合jvm规定
静态变量 赋值为 默认值 static String s;
final成员变量(基础类型) 赋值为 默认值 final int a;
??将类、方法、属性等符号解析为直接引用,
??常量池中的各种符号解析为指针、偏移量等内存地址的直接引用
??静态成员变量 赋值为 初始值 static String s="ss";
??调用类构造器方法(静态代码块)
1.申请对象内存空间
2.成员变量 赋值为 默认值
3.调用对象构造方法
1)调用父类构造方法
2)调用变量顺序赋初始值
3)执行构造方法
原文:https://www.cnblogs.com/mznsndy/p/14995393.html