什么时候使用ClassDefiner?

时间:2011-09-07 10:36:34

标签: java jvm classloader


我遇到了ClassLoader问题,它是这样的:

java.lang.ClassCastException: com.google.appengine.api.datastore.Key 
cannot be cast to com.google.appengine.api.datastore.Key

起初我不知道这是怎么发生的,但经过一些搜索后我才知道如果同一个类被2个不同的ClassCastException加载,也会抛出ClassLoader。我继续挖掘并发现了这一点:

[从JVM_DefineClass加载com.google.appengine.api.datastore.Key]
...
[来自文件的加载com.google.appengine.api.datastore.Key:/home/alex/java/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.5.1.r36v201106211634/appengine-java-sdk-1.5.1 /lib/user/appengine-api-1.0-sdk-1.5.1.jar]

这确实证明Key实际上已加载到2个不同的ClassLoader中。但是,我不知道如何继续我的调查;我知道新的ClassLoader是通过ClassDefiner实例化的(请参阅http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/reflect/sun/reflect/ClassDefiner.java.htm),但我不知道为什么。我用Google搜索了一些答案,但没有找到答案。

是否与基础测试使用ClassLoader设置不同@BeforeClass这一事实有关?但如果那是真的(我可以接受JVM_DefineClass),那么第二个ClassLoader是什么呢?

希望在这里找到一些答案, 亚历克斯。

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全掌握了你的问题,但没有其他人在回答,所以我会试一试。首先,ClassDefiner与此有什么关系?你在某个地方使用它吗?尽管ClassDefiner创建了一个新的ClassLoader,它使用给定的父ClassLoader作为新的ClassLoader的父级,而默认的ClassLoader行为是在加载它本身之前在父ClassLoader中搜索一个类,所以这本身不会导致“类”由两个ClassLoader加载“你正在描述的问题。

在@BeforeClass中设置不同的ClassLoader是什么意思?如果你在某个ClassLoader中加载一个类,将类或类的实例保存在某个地方,然后任意切换ClassLoaders,你当然可以看到这样的问题。

这有什么帮助吗?当你应该查看自己的代码时,我感觉你正在寻找Java核心类中的错误。在建立的库中假设一个错误时要小心谨慎。