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

Jay*_*yan 6 java cobertura classloader

我有类汇编实现IAssembly.

启动应用程序时看到以下错误

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

汇编代码

class package.Assembly implements IAssembly {

}
Run Code Online (Sandbox Code Playgroud)

IAssembly

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

通过使界面"公开",错误消失了.

Byr*_*ins 8

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

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

也许检查哪个加载器正在找到您的检测类,并查看是否有办法同时从同一个类加载器加载IAssemblyAssembly加载.