2011-09-07 87 views
0


我碰到一个ClassLoader的问题,它是这样的:何时使用ClassDefiner?

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

起初,我不知道这是怎么发生的,但一些搜索后我才知道,ClassCastException也可以扔掉如果同一班级由2个不同的ClassLoader加载。我继续挖过来,发现这样的:

[从JVM_DefineClass加载com.google.appengine.api.datastore.Key]
...
[加载com.google.appengine.api.datastore.Key from file:/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实际上是加载在两个不同的ClassLoader s。但是,我不知道如何继续我的调查。我知道一个新的ClassLoader通过ClassDefiner(请参阅http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/reflect/sun/reflect/ClassDefiner.java.htm)实例化,但我不知道为什么。我搜索了一些答案,但没有发现。

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

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

回答

0

我不确定我是否完全了解您的问题,但没有人会回答,所以我会给它一个答案。首先,ClassDefiner与此有什么关系?你在某个地方使用它吗?尽管ClassDefiner创建了一个新的ClassLoader,但它使用给定的父ClassLoader作为新的ClassLoader的父对象,并且默认的ClassLoader行为是在加载它之前在父ClassLoader中搜索一个类,因此这本身不会导致“class由你描述的两个ClassLoaders问题加载。

对于在@BeforeClass中设置不同的ClassLoader,你是什么意思?如果您在某个ClassLoader中加载一个类,请将该类的类或实例保留在某处,然后任意切换ClassLoader,那么您肯定会看到类似的问题。

有帮助吗?当您应该查看您自己的代码时,我感觉您正在寻找Java核心类中的错误。在建立的图书馆中始终谨慎地承担错误。

+0

Hi Ryan,我不是在寻找jdk中的错误,而是尝试修复我的设置:) - 在过去的几天里它一直让我疯狂。我会尽量缩短 - –

+0

http://pastebin.com/GVdzMdQX。我会调查他们,这肯定很清楚'Key'类被加载了两次......并且我确定我的代码中存在某些错误;) –