【发布时间】:2018-05-22 15:22:24
【问题描述】:
我在 Spring Controller 中使用内部类。从它的父类超类访问受保护的字段/方法时遇到问题。
研究表明,这是由不同的类加载器在某种程度上造成的,但我对 Spring 的了解还不够,无法确定。
class SuperBaseController {
protected String aField;
protected void aMethod() {
}
}
@Controller
class OuterMyController extends SuperBaseController {
class Inner {
public void itsMethod() {
// java.lang.IllegalAccessError: tried to access method
aMethod();
}
public void getField() {
// java.lang.IllegalAccessError: tried to access field
String s = aField;
}
}
void doSomething () {
// Obviously fine.
aMethod();
// Fails in the Inner method call.
new Inner().itsMethod();
// Obviously fine.
String s = aField;
// Fails in the Inner method call.
new Inner().getField();
}
}
是否有任何简单的技术可以避免/解决此问题?最好是那些不涉及制作字段/方法的public。
我已经确认外部类的ClassLoader属性与超类的属性不一样。
【问题讨论】:
-
MyController.this.aMethod()也会发生这种情况吗? -
您使用的是哪个编译器(和版本)?
-
@ErwinBolwidt -
Java1.8.0_151(目标 1.7) -Spring3.0.7 -
你在谈论类加载器,所以这是由于 Spring 使用一个类加载器加载
MyController导致的(显然 Spring 将加载该控制器类),并且因为Inner在需要时才会加载,它会加载不同的类加载器吗?如果你在@PostConstruct方法中摆弄Inner(这应该会触发类加载),那么它会起作用吗? -
你能发布确切的堆栈跟踪(至少是前几行)吗?该错误应该源于编译器在
MyController类中创建的合成访问器方法。确切的细节将提示原因。
标签: java spring inner-classes superclass illegalaccessexception