我碰到一个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
呢?
希望在这里找到一些答案, 亚历克斯。
Hi Ryan,我不是在寻找jdk中的错误,而是尝试修复我的设置:) - 在过去的几天里它一直让我疯狂。我会尽量缩短 - –
http://pastebin.com/GVdzMdQX。我会调查他们,这肯定很清楚'Key'类被加载了两次......并且我确定我的代码中存在某些错误;) –