我在Spring控制器中使用了内部类。它在访问其父类的超类的受保护字段/方法时出现问题。
研究表明,这可能是由于不同的类加载器造成的,但我对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
属性与超类不同。
Java
1.8.0_151 (目标版本 1.7) -Spring
3.0.7 - OldCurmudgeonMyController
(显然Spring会加载该控制器类),并且由于Inner
直到需要时才会被加载,所以它将使用另一个类加载器进行加载?如果你在@PostConstruct
方法中调用Inner
,会触发类加载,能够正常工作吗? - KayamanMyController
类中创建的合成访问器方法。具体细节将给出造成问题的提示。 - Erwin Bolwidt