如果针对代码,设置参数-XX:+TraceClassLoading,可以追踪类的加载信息并打印出来。
/*
* 4.当使用java.lang.reflect包中的方法反射类的方法时。比如:Class.forName("com.young.java.Test")
* 5.当初始化子类时,如果发现其父类还没有进行过初始化,则需要先触发父类的初始化。
* 6.如果一个接口定义了default方法,那么直接实现或者间接实现该接口的类的初始化,该接口要在其之前被初始化。
* 7.当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个类。
* 8.当初次调用 MethodHandle 实例时,初始化该 MethodHandle 指向的方法所在类。(涉及解析REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄对应的类)
*
*
*针对5,补充说明:
*当Java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则不适用于接口。
*在初始化一个类时,并不会先初始化它所实现的接口
*在初始化一个接口时,并不会先初始化它的父接口
*因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的静态字段时,才不会导致该接口的初始化。
*/
public class ActiveUser3 {
@Test
public void test1() throws ClassNotFoundException {
Class clazz = Class.forName("com.young.springbootdemo.jvm.Order");
}
@Test
public void test2() {
System.out.println(Son.num);
}
@Test
public void test3(){
System.out.println(CompareC.NUM1);
}
}
class Father {
static {
System.out.println("Father类的初始化过程");
}
}
class Son extends Father implements CompareB {
static {
System.out.println("Son类的初始化过程");
}
public static int num = 1;
}
interface CompareB {
public static final Thread t = new Thread() {
{
System.out.println("CompareB的初始化");
}
};
default void method1(){
System.out.println("你好!");
}
}
interface CompareC extends CompareB {
public static final Thread t = new Thread() {
{
System.out.println("CompareC的初始化");
}
};
public static final int NUM1 = new Random().nextInt();
}
梦想很模糊,去追,它会渐变清晰。青春励志,奋斗下去别放弃。
网友评论