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