gpt4 book ai didi

java - 为什么我无法访问匿名内部类中重写的公共(public)字段?

转载 作者:行者123 更新时间:2023-12-01 05:11:04 36 4
gpt4 key购买 nike

我有一个无法更改的类,如下所示:

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 具有匿名内部类,我无法访问任何重写的成员,即使它们是公共(public)的。

最佳答案

我认为这个问题有两个方面。

你的Java代码在语法上是有效的(我认为),但它几乎肯定不会做你想要它做的事情。具体来说,匿名类中的声明不会替换 Foo 类中的声明。相反,匿名类的每个实例都会获得两组字段。 Foo 中声明的方法只能看到原始字段,而匿名类中声明的任何方法都将看到新字段。

如果您希望匿名子类中的字段具有不同的值,则:

  • 它们不是最终的,并且
  • 它们需要被分配而不是重新声明。

我确实无法建议解决此问题的最佳方法,但我认为您需要通过将 Foo 字段设为私有(private)并提供 getter 和/来开始或他们的设置者。对于 setter ,您可以使用访问修饰符来允许匿名子类设置字段,但不允许不相关的代码。

最重要的是,您不能覆盖 Java 中的字段。您的代码所做的并不是覆盖,而是隐藏字段。

<小时/>

另一个方面是包装的异常来自 Javascript 引擎。我认为问题在于匿名类是隐式私有(private)的,因此您的 Javascript 代码片段试图访问私有(private)类上的字段。当 Javascript 引擎尝试执行此操作时(我希望使用 Java 反射),它会收到运行时异常。

这里唯一不幸的是,异常消息没有说明为什么它无法访问该成员,但是您的Java代码足够“奇怪”,这并不让我感到惊讶。

作为解决方法,我建议将匿名类替换为非嵌套类。

关于java - 为什么我无法访问匿名内部类中重写的公共(public)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12023057/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com