2016-02-19 10 views
0

Я использую Equinox Transforms, чтобы заменить один класс своей пользовательской версией в пути к классам. Кажется, что механизм преобразования работает правильно, и я возвращаю InputStream пользовательского класса от public InputStream getInputStream(InputStream inputStream, URL transformerUrl) моего класса трансформатора.Замена класса другим с помощью Eclipse Transforms: не удается исправить ClassFormatError

Но при загрузке этого класса в результате получается ClassFormatError с сообщением Truncated class file. Единственное, что я могу себе представить, это несоответствие между версиями Java, но я сделал все, что я знаю, как сделать, чтобы устранить это как источник проблемы, но безуспешно.

Я удалил все, кроме одного JDK из Eclipse, в настройке установленных JRE. Я убедился, что все подключаемые модули имеют одну и ту же версию Java для среды исполнения, а JRE в пути сборки задана с той же средой выполнения. Цели и среды выполнения продукта определены одинаково. Я сделал clean all в рабочей области и повторно запустил eclipse и мое рабочее место во время выполнения много раз, с -clean. В конце концов, я все еще получаю ошибку.

Что еще может быть, если не версии Java, вызывающие эту ошибку? На странице Equinox Transforms говорится, что он может использоваться для преобразования ресурсов класса. Кто-нибудь на самом деле это сделал?

+0

Последняя фиксация этого проекта - 2013 год, кажется, заброшен .. –

+0

Да, я это заметил. Но он был задокументирован как работающий. Возможно, что-то я не понимаю о загрузке классов, потому что код равноденствия, похоже, делает то, что он должен. – MidnightJava

+0

Вы должны попробовать «стандартный» способ переопределения классов в osgi: weavinghook https://osgi.org/javadoc/r6/core/org/osgi/framework/hooks/weaving/WeavingHook.html –

ответ

2

Существует более стандартизированный способ замены класса в osgi через WeavingHook. Этот крючок должен быть зарегистрирован как услуга и иметь возможность динамически повышать класс.

См. the WeavingHook Javadoc или конкретный пример с Aries Proxy, который динамически создает прокси с помощью asm (WovenProxyGenerator).

+0

Спасибо, это был гораздо более простой подход, чем создание моего собственного преобразования с использованием общего расширения. Сначала я столкнулся с проблемой из-за того, как я получил байты класса замены. Первоначально я пытался подключиться к плагину: InputStream = Activator.class.getClassLoader(). GetResourceAsStream ("/" + "qualified.class.name" .replaceAll ("\\.", "/") + ".class"); Я думал, что это разрешит класс замены в текущем проекте, но он фактически разрешил исходный класс в стороннем подключаемом модуле. – MidnightJava

+0

Это сработало: InputStream = новый URL («платформа: /plugin/my.plugin.name/bin/path/to/replacement/class.»). OpenConnection(). GetInputStream(); – MidnightJava