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