IllegalAccessError:class <classname>无法访问其超接口<interfacename> </interfacename> </classname>

时间:2011-09-16 14:42:28

标签: java classloader cobertura

我有类装配实现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

}

装配和IAssembly存在于两个不同的罐子中。两个罐子都由不同的类加载器加载。 Assembly类加载在子类加载器中,IAssembly是父类。类加载器正在使用链接。

在正常情况下,这是有效的。在使用cobertura检测罐子后运行我的应用程序时发生错误。没有仪器,一切正常。 cobertura仪器会导致这样的错误吗?或者这是一个等待被发现的错误,但是对于cobertura,错误很快就会暴露出来。

通过使界面“公开”,错误就会消失。

3 个答案:

答案 0 :(得分:7)

在我看来,即使加载器被链接,封装保护也会因仪器和多个类加载器而失败。 java.lang.instrument.Instrumentation上的这个javadoc与您的场景没有直接关系,但确实描述了类似的场景:

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

也许检查哪个加载程序正在查找已检测的类,并查看是否有办法从同一个类加载器加载AssemblyIAssembly

答案 1 :(得分:1)

我认为您的问题可能是您没有使用IAssembly的兼容版本。因此,即使它在您的类路径中,接口及其实现也不匹配。

如果是类加载器问题,你会得到一个NoClassDefFoundError。

答案 2 :(得分:0)

我将为该错误消息再添加两个原因

  1. 如果界面的可见性不正确,并且您需要将其从protected更改为public或将private更改为protected或,也会发生此错误。 ...我知道这不是这里的原因,因为发问者知道看到他的评论。
  2. 在您的IDE中,所有内容均为绿色,但在OSGI环境中,您会收到此错误。您需要检查该类是否已导出,而不是在私有包中。