访问方法时出现 IllegalAccess 错误

Posted

技术标签:

【中文标题】访问方法时出现 IllegalAccess 错误【英文标题】:IllegalAccess Error while accessing a method 【发布时间】:2017-11-04 03:29:41 【问题描述】:

我有两节课。

    扩展了 B 类的 A 类 B 类有内部静态最终类,比方说 C 这个内部静态类 C 有私有方法 method1。 D 类扩展 A 类并调用内部 C 类的方法并注入自身。

更详细:

    public class D extends A
        public static void main(arg)
            C.someMethod(new A(), args)
        
    


    public class A extends B
         .....
    

    public class B

        public static final class C
             private B fieldB;
             private static instance;

             private C(B inB, String args)
                   this.fieldB = inB;
                   this.fieldB.method1(args) // illegalAccess
             

             public static void someMethod(B b, String arg)
                    if(instanceC== null)
                           instanceC= new C(b, args)
                    else ..
         

         private void method1(String arg)
    

使用该代码,我收到以下错误:

java.lang.IllegalAccessError: 试图访问方法 B.method1(Ljava/lang...)V 来自 A$C 类

我没有任何编译错误,但在运行时出现错误。这里有什么问题?

注意:B 类定义在作为依赖项添加的 jar 文件中。 注意:当我调试时,当它调用 C.someMethod 时,它在框架面板上显示为

someMethod 1253, A$C

不应该像下面这样吗?

someMethod 1253, B$C

【问题讨论】:

您的代码无法编译。您收到错误是因为您的 method1() 不接受任何参数,但您正在传递字符串。您还需要在 C 类中定义静态 someMethod(A a,String[] args) 才能运行代码。 它是代码的一部分,刚刚编辑过。 【参考方案1】:

method1 是 C 类的私有成员,只能由 C 类访问。您试图通过 B 类实例访问,它会抛出 IllegalAccessError

【讨论】:

我对此表示怀疑,但是当我用一些小代码尝试相同的场景时,我没有得到相同的错误。 你可能对@VNT所说的做错了。如果该私有方法 method1() 在 C 内部,则它对 B 不可见,因此会出现编译错误。如果该方法在 C 类之外但在 B 内,则应该不会有任何错误。您尝试呈现代码的方式与您实际使用的方式可能不相似。 好的,我已经仔细检查了代码,是的,我忘记了其中一个课程。实际上代码看起来像已编辑。【参考方案2】:

我的问题终于解决了,我清理了项目并重新启动并从头开始构建它可以工作。看来 JVM 搞砸了。

【讨论】:

以上是关于访问方法时出现 IllegalAccess 错误的主要内容,如果未能解决你的问题,请参考以下文章

为什么在尝试将指向数组的指针作为函数的参数时出现访问冲突错误?

调用 [playerFactory play] 方法时出现错误访问错误

WSDL可调用接口方法调用时出现访问冲突错误...?

Eclipse开发时出现HTTP 403 错误(禁止访问)的解决方法

尝试在启用分页的情况下访问 VESA LFB 时出现页面错误

访问 Payeezy Url 时出现 kCFErrorDomainCFNetwork 错误