Java ClassLoader loadClass()的工作是什么

Java ClassLoader loadClass()的工作是什么,java,Java,我已经编写了一个小java类,我想用ClassLoader加载它 public class ClassLoadingObj { public ClassLoadingObj(){ System.out.println("---instantiating ClassLoadingObj "); } static{ System.out.println("---Loading ClassLoadingObj"); } } 但当我执

我已经编写了一个小java类,我想用ClassLoader加载它

public class ClassLoadingObj {

    public ClassLoadingObj(){
        System.out.println("---instantiating ClassLoadingObj ");
    }

    static{
        System.out.println("---Loading ClassLoadingObj");
    }
}
但当我执行以下代码时:

ClassLoader.getSystemClassLoader().loadClass("com.st.classLoader.ClassLoadingObj");

我发现静态块没有被执行。我的问题是,如果使用
loadClass()
方法加载一个类,那么与实例化一个总是执行静态块的类相比,为什么不执行静态块呢。也许您使用的类加载器是 但是系统不会使用this类加载器。你可以试试 com.sun.org.apache.bcel.internal.util.ClassLoader.getSystemClassLoader(),它将执行 静态块。更多信息,请参考此
page()

实际上,静态块是在类初始化时执行的,它与加载的有点不同

初始化之前类是链接的,在此之前它是加载的,因此类有3个(或4个,包括未加载)状态

很好地描述了它是如何工作的,以及初始化类的要求是什么

摘录:

Java虚拟机规范给出了实现 类和接口加载和链接时间的灵活性, 但严格定义了初始化的时间。所有实现 必须在第一次使用时初始化每个类或接口。这个 以下六种情况可作为有效使用:

  • 创建一个类的新实例(在字节码中,执行一条新指令。或者,通过隐式创建, 反射、克隆或反序列化。)
  • 调用由类声明的静态方法(在字节码中,执行invokestatic指令)
  • 由类或接口声明的静态字段的使用或赋值,但最终初始化的静态字段除外 通过编译时常量表达式(在字节码中,执行 (对于getstatic或putstatic指令)
  • Java API中某些反射方法的调用,例如类中的方法或 java.lang.reflect包
  • 类的子类的初始化(类的初始化需要先初始化其超类)
  • 当Java虚拟机启动时,将类指定为初始类(使用main()<方法)