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