如何检查类是否已初始化?

mik*_*1aj 11 java classloader static-initializer

您可能会问,为什么我要这样做 - 这是因为我正在使用一个类(来自外部库),它在静态初始化程序中执行操作,我需要知道它是否已经完成.

我看了看ClassLoader,但没有找到任何看起来有用的东西.有任何想法吗?

Col*_*ert 14

您可以使用该ClassLoader.findLoadedClass()方法.如果它返回null,则不加载该类.这样,如果类尚未加载,则不加载该类.


警告:此代码在此处不起作用,在系统ClassLoader findLoadedClass()中受到保护,您需要使用自己的ClassLoader覆盖它.

检查下面的链接在同一主题上检查是否已使用系统ClassLoader加载类

if(ClassLoader.getSystemClassLoader().findLoadedClass("java.lang.String") != null){
    System.out.println("Yepee, String is loaded !");
}
Run Code Online (Sandbox Code Playgroud)

来自@irreputable非常好的一点:

"加载"并不意味着"初始化".初始化仅发生在JLS3 $ 12.4.1定义的精确时刻

我引述:

类或接口类型T将在第一次出现以下任何一个之前立即初始化:

  • T是一个类,并且创建了T的实例.
  • T是一个类,并且调用由T声明的静态方法.
  • 分配由T声明的静态字段.
  • 使用由T声明的静态字段,该字段不是常量变量(第4.12.4节).
  • T是顶级类,并且执行在词典内嵌套在T中assert语句(第14.10节).

在类Class和包中调用某些反射方法java.lang.reflect也会导致类或接口初始化.在任何其他情况下,不会初始化类或接口.


资源:

在同一主题上: