【发布时间】:2023-03-28 17:34:01
【问题描述】:
我有一个无法更改的课程,如下所示:
public class Foo {
public final int ID=0;
public int bar;
public final Object baz=null;
}
我想要一个覆盖Foo 的匿名内部类,例如:
public Foo newFoo(final int mID, final int mbar, final Object mbaz) {
return new Foo(){
public final int ID = mID;
public int bar = mbar;
public final Object baz = mbaz;
};
}
然后我有一个javax.script.ScriptEngine,我想在 JS 中这样称呼它:newFoo(0,0,undefined)["ID"]
我的问题是我遇到了这样的异常:
sun.org.mozilla.javascript.internal.WrappedException: Wrapped java.lang.IllegalAccessException: Class sun.org.mozilla.javascript.internal.JavaMembers can not access a member of class Baz$1 with modifiers "public final" (mod.js#9) in test.js at line number 9
我不明白我怎么会在这里遇到问题:如果newFoo 返回一个普通的'ol Foo,这很好用,但如果我尝试用匿名内部类覆盖Foo,我即使他们是公开的,也无法访问任何被覆盖的成员。
【问题讨论】:
-
你在做什么看起来“奇怪”,但我会从告诉你最终 int ID 的错误消息开始 - 你的匿名构造函数正试图再次设置一个 final。也许尝试使 ID 成为非最终的。
-
你不能这样做,错误信息告诉你原因。
标签: java inner-classes scriptengine