IllegalAccessError: класс <classname>не может получить доступ к своему суперинтерфейсу <interfacename> - PullRequest
6 голосов
/ 16 сентября 2011

У меня есть класс Assembly, реализующий IAssembly.

Я вижу следующую ошибку при запуске приложения

Caused by: java.lang.IllegalAccessError: class <Assembly > cannot access its superinterface <IAssembly>
        at java.lang.ClassLoader.defineClass1(Native Method)

Код сборки

class package.Assembly implements IAssembly {

}

IAssembly

interface IAssembly { //note -this is not public, so uses default protected

}

Сборка и сборка IA существуют в двух разных банках. Обе банки загружаются разными загрузчиками классов. Класс Assembly загружается в дочерний загрузчик классов, IAssembly является родительским. Загрузчики классов используют сцепление.

В обычных случаях это работает. Ошибка возникает, когда я запускаю свое приложение после инструментирования банок с помощью cobertura. Без приборов все работает нормально. Может ли прибор Cobertura вызывать такую ​​ошибку? Или Это ошибка в любом случае, ожидающая обнаружения, но с cobertura ошибка быстро обнаруживается.

Если сделать интерфейс «общедоступным», ошибка исчезнет.

Ответы [ 2 ]

7 голосов
/ 08 октября 2011

Мне кажется, что защита пакетов не работает с инструментарием и несколькими загрузчиками классов, даже если загрузчики связаны друг с другом. Этот javadoc на java.lang.instrument.Instrumentation не имеет прямого отношения к вашему сценарию, но он описывает похожий сценарий:

http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#appendToBootstrapClassLoaderSearch(java.util.jar.JarFile)

Возможно, проверьте, какой загрузчик находит ваши инструментированные классы, и посмотрите, есть ли способ получить и Assembly, и IAssembly для загрузки из того же загрузчика классов.

1 голос
/ 16 сентября 2011

Я думаю, что ваша проблема может быть в том, что вы не используете совместимую версию IAssembly. Таким образом, даже если он находится в вашем пути к классам, интерфейс и его реализация не совпадают.

Если бы это была проблема загрузчика классов, вы бы получили NoClassDefFoundError.

...