不安全的类加载问题?

时间:2011-05-10 00:56:35

标签: java unsafe

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          

2 个答案:

答案 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)清除字段可能是一个问题......