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也会导致类或接口初始化.在任何其他情况下,不会初始化类或接口.
资源:
在同一主题上: