2011-09-07 92 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'類被加載了兩次......並且我確定我的代碼中存在某些錯誤;) –