# 双亲委派机制
java 虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的 class 文件加载到内存生成 class 对象。而且加载某个 class 文件时,java 虚拟机采用的是双亲委派机制,即把请求交由父类处理,它是一种任务委派模式.
# 沙箱安全机制
自定义 String 类,但是在加载自定义 String 类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载 jdk 自带的文件 (rt.jar 包中 java\lang\String.class), 报错信息说没有 main 方法,就是因为加载的是 rt.jar 包中的 String 类。这样可以保证对 java 核心源代码的保护,这就是沙箱安全机制
# 其他
在 jvm 中表示两个 class 对象是否为同一个类存在的两个必要条件 :
- 类的完整类名必须一致,包括包名
- 加载这个类的 ClassLoader (指 ClassLoader 实例对象) 必须相同
换句话说,在 jvm 中,即使这两个类对象 (class 对象) 来源于同一个 Class 文件,被同一个虚拟机所加载,但只要加载它们的 ClassLoader 不同,那么这两个类对象也是不相等的
# 对类加载器的应用
jvm 必须知道一个类型是由启动加载器加载的还是用户类加载器加载的。如果一个类型是用户类加载器加载的,那么 jvm 会将这个类加载器的一个应用作为类型信息的一部分保存在方法区。当解析一个类型到另一个类型的应用的时候,jvm 需要保证这两个类型的类加载器是相同的
# 类的主动使用和被动使用
主动使用,又分为七种情况
创建类的实例
访问某个类或接口的静态变量,或者对静态变量赋值
调用类的静态方法
反射 (比如: Class.forName ("com.wong.Test"))
初始化一个类的子类
Java 虚拟机启动时被标明为启动类的类
JDK7 开始提供的动态语言支持 :
java.lang.invoke.MethodHandle 实例的解析结果
REF_getStatic, REF_putStatic, REF_invokeStatic 句柄对应的类没有初始化,则初始化
除了以上七种情况,其他使用 Java 类的方式都被看作是对类的被动使用,都不会导致类的初始化
