3. 补充内容
3.1 在jvm中表示两个class对象是否为同一个类的两个必要条件
- 类的完整类名必须一致,包括包名。
- 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同
| 换句话说,在jvm中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的.
| 自定义的java.lang.String类和核心库中的java.lang.String,前者的ClassLoader是系统类加载器,后者的ClassLoader是引导类加载器,所以这两个String不是同一个类
3.2 对类加载器的引用
JVM必须知道一个类型是由启动类加载器加载的还是由用户类加载器加载的。如果一个类型由用户类加载器加载的,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。当解析一个类型到另一个类型的引用的时候,JVM需要保证两个类型的类加载器是相同的。
3.3 Java程序对类的使用方式分为主动使用和被动使用
| 主动使用和被动使用的区别就是是否会导致类的初始化
3.3.1 主动使用,分为七种情况
- 创建类的实例
- 访问某个类或接口的静态变量,或者对静态变量赋值
- 调用类的静态方法
- 反射,比如Class.forName(com.dsh.jvm.xxx)
- 初始化一个类的子类
- Java虚拟机启动时被标明为启动类的类
- JDK7 开始提供的动态语言支持:
java.lang.invoke.MethodHandle实例的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic句柄对应的类没有初始化,则初始化
| 除了以上七种情况,其他使用java类的方式都被看作是对类的被动使用,都不会导致类的初始化。