Unsafe有一个方法来确保初始化类:
Unsafe.ensureClassInitialized(Class) line: not available [native method]
我怀疑这种类型的初始化并没有像普通的java类加载那样锁定类,因为我偶尔碰到一些不可能的情况。如果需要,我可以稍后提供更多详细信息,但有人知道使用Unsafe加载类是否有这样的怪癖?
顺便说一下,这是一个关于该类如何加载的简短堆栈跟踪:
Unsafe.ensureClassInitialized(Class) line: not available [native method]
UnsafeFieldAccessorFactory.newFieldAccessor(Field, boolean) line: 25
ReflectionFactory.newFieldAccessor(Field, boolean) line: 122
Field.acquireFieldAccessor(boolean) line: 918
Field.getFieldAccessor(Object) line: 899
Field.get(Object) line: 358
答案 0 :(得分:3)
对于参考和Web分析,事实证明您可以在不使用Unsafe
的情况下强制进行类初始化:
Class.forName(cls.getName(), true, cls.getClassLoader());
不漂亮,但确实有效。
答案 1 :(得分:1)
这里有一个类似的问题:https://issues.apache.org/bugzilla/show_bug.cgi?id=43867(搜索“不安全”以跳转到相关部分)可能会有所帮助,但如果没有更多的上下文和代码,很难说出来......
Tomcat,渴望清除掉 使用的类中的静态字段 反思,已经在不知不觉中造成了 要重新运行的类init代码 反思的作用方式。当它 点击试图使用的代码 日志工厂,它不知道它 已经破坏了logfactory 在logfactory中设置字段 为空。
因此,通过反射(直接或使用Tomcat)清除字段可能是一个问题......