我有类装配实现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,错误很快就会暴露出来。
通过使界面“公开”,错误就会消失。
答案 0 :(得分:7)
在我看来,即使加载器被链接,封装保护也会因仪器和多个类加载器而失败。 java.lang.instrument.Instrumentation
上的这个javadoc与您的场景没有直接关系,但确实描述了类似的场景:
也许检查哪个加载程序正在查找已检测的类,并查看是否有办法从同一个类加载器加载Assembly
和IAssembly
。
答案 1 :(得分:1)
我认为您的问题可能是您没有使用IAssembly的兼容版本。因此,即使它在您的类路径中,接口及其实现也不匹配。
如果是类加载器问题,你会得到一个NoClassDefFoundError。
答案 2 :(得分:0)
我将为该错误消息再添加两个原因
protected
更改为public
或将private
更改为protected
或,也会发生此错误。 ...我知道这不是这里的原因,因为发问者知道看到他的评论。