Я столкнулся с проблемой ClassLoader, и она выглядит примерно так:
java.lang.ClassCastException: com.google.appengine.api.datastore.Key
cannot be cast to com.google.appengine.api.datastore.Key
Сначала я понятия не имел, как это могло произойти, но после некоторого поиска я узнал, что ClassCastException
также может быть выброшено, если один и тот же класс загружен двумя разными ClassLoader
с. Я продолжал копаться и обнаружил это:
[Загружен com.google.appengine.api.datastore.Key from JVM_DefineClass]
...
[Загружен 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),, но я понятия не имею, почему. Я нашел несколько ответов, но не нашел ни одного.
Имеет ли это какое-либо отношение к тому факту, что базовый тест устанавливает другой ClassLoader
с использованием @BeforeClass
? Но если это правда (я могу принять JVM_DefineClass), что это за второй ClassLoader
?
Надеюсь найти ответы здесь,
Алекс.