【问题标题】:IllegalAccessError:class <classname> cannot access its superinterface <interfacename>IllegalAccessError:class <classname> 无法访问其超接口 <interfacename>
【发布时间】:2011-09-16 14:42:27
【问题描述】:

我有实现 IAssembly 的类 Assembly。

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

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

汇编代码

class package.Assembly implements IAssembly {

}

组装

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

}

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

在正常情况下,这是有效的。当我在使用 cobertura 检测 jar 后运行我的应用程序时发生错误。没有仪器,一切正常。 cobertura 仪器会导致这样的错误吗?或者无论如何,这都是一个等待检测的错误,但使用 cobertura 时,该错误很快就会暴露出来。

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

【问题讨论】:

  • 为什么需要使用不同的类加载器来加载 jar?您的应用程序是如何部署/运行的?通常最好将东西打包在一起(对于简单的应用程序)或通过 JNDI 和 RMI 之类的 EJB 访问。我会亲自把你的界面和你的类放在同一个罐子里。但这只是我。
  • 对我来说,这条消息导致了类路径问题,其中包package_example 的定义如下:A/package_example/classA、B/package_example/classB。当然,A 和 B 都必须在类路径中才能正常工作。

标签: java classloader cobertura


【解决方案1】:

在我看来,检测和多个类加载器的包保护失败,即使加载器是链式的。 java.lang.instrument.Instrumentation 上的这个 javadoc 与您的场景没有直接关系,但它确实描述了类似的场景:

代理应注意确保 JAR 不包含任何类或资源,除了由引导类加载器为检测目的而定义的类或资源。不遵守此警告可能会导致难以诊断的意外行为。例如,假设有一个加载器 L,L 的委托父级是引导类加载器。此外,由 L 定义的类 C 中的方法引用非公共访问器类 C$1。如果 JAR 文件包含类 C$1,那么对引导类加载器的委托将导致 C$1 由引导类加载器定义。在此示例中,将引发 IllegalAccessError,这可能导致应用程序失败。避免此类问题的一种方法是为检测类使用唯一的包名称。

Java 虚拟机规范规定,后续尝试解析 Java 虚拟机之前未成功尝试解析的符号引用总是会失败,并引发与初始解析尝试相同的错误。因此,如果 JAR 文件包含与 Java 虚拟机尝试解析引用失败的类对应的条目,则后续解析该引用的尝试将失败,并出现与初始尝试相同的错误。

也许检查哪个加载器正在查找您的检测类,看看是否有办法让Assembly 和IAssembly 从同一个类加载器加载。

【讨论】:

    【解决方案2】:

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

    如果是类加载器问题,您会收到 NoClassDefFoundError。

    【讨论】:

    • 每个类只有一个版本。
    【解决方案3】:

    我将再添加两个导致此错误消息的原因

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多