Когда используется ClassDefiner? - PullRequest
0 голосов
/ 07 сентября 2011


Я столкнулся с проблемой 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?

Надеюсь найти ответы здесь, Алекс.

1 Ответ

0 голосов
/ 07 сентября 2011

Я не уверен, что вполне понимаю вашу проблему, но никто больше не отвечает, поэтому я попробую.Во-первых, что ClassDefiner имеет отношение к этому?Вы используете это где-нибудь?Несмотря на то, что ClassDefiner создает новый ClassLoader, он использует заданный родительский ClassLoader в качестве родителя нового ClassLoader, и поведение ClassLoader по умолчанию заключается в поиске класса в родительском ClassLoader перед его самой загрузкой, так что это само по себе не вызовет «класс»загружается двумя описанными вами проблемами ClassLoaders.

Что вы имеете в виду при установке другого ClassLoader в @BeforeClass?Если вы загружаете класс в какой-либо ClassLoader, где-то сохраняете класс или экземпляры класса, а затем произвольно переключаете ClassLoader, вы наверняка можете увидеть такие проблемы.

Помогает ли что-нибудь из этого?У меня такое ощущение, что вы ищете ошибку в базовых классах Java, когда вам, вероятно, следует искать собственный код.Всегда будьте осторожны с ошибкой в ​​установленной библиотеке.

...