IllegalAccessError:访问受保护的方法

11 java

我有两节课.

A有保护方法m(),a是一个实例A.

B与类在同一个包中A.

我想访问a.m()但我得到IllegalAccessError...

怎么了?

Tom*_*ine 19

编译器应该捕获这样的错误.正如你在运行时显然得到的那样,发生了一些奇怪的事情.您可能已更改源代码但已完全重新编译.

另一个潜在但又模糊的问题是通过不同的类加载器加载类.即使包名称相同,从不同类加载器加载的类也将位于不同的包中(与由不同类加载器加载的具有相同名称的类相同的方式将是不同的类).


Jör*_*ann 17

如果类A和B由不同的类加载器加载,则会发生这种情况.然后,jvm将这些类视为不同的"运行时包".引用jvm规范,第5.3节:

在运行时,类或接口不是由其名称单独确定,而是由一对确定:它的完全限定名称及其定义的类加载器.每个这样的类或接口都属于单个运行时包.类或接口的运行时包由包名称和类或接口的类加载器定义.

在5.4.4节中:

当且仅当满足以下任一条件时,才能访问类或接口D的字段或方法R.

...

R既可以是受保护的,也可以是包私有的(既不是公共的也不是受保护的,也不是私有的),并且由与D相同的运行时包中的类声明.