java - 在 javascript 中使用 java 对象时出现 IllegalAccessException

标签 java javascript javafx javafx-webengine

我将使用 WebView/WebEngine 来显示简单多人游戏的“日志”(即聊天消息、游戏状态消息……)。

这是我在 javascript 部分写的内容。

function addLogMessage(o) {
    var kind = o.getMessageKindCase();
    if (kind.equals(kind.CHAT_MESSAGE)) {
        $("body").append(createChatMessage(o.getChatMessage()));
    } else (/* other cases following... */)
}

function addLogMessages(l) {
    var n = l.size();
    for (var i = 0; i < n; i++) {
        addLogMessage(l.get(i));
    }
}

这是我在java部分写的。

private GameStatus gameStatus;
private WebEngine logWebEngine;
private final ObjectProperty<JSObject> window = new SimpleObjectProperty<>(this, "window");

public void initialize(URL url, ResourceBundle rb) {
    gameStatus = /* ... */;

    window.addListener((o, oldValue, newValue) -> {
        if (newValue == null) {
            return;
        }
        // getLogMessages() will return java.util.List<LogMessage>
        newValue.call("addLogMessages", gameStatus.getLogMessages());
    });

    logWebEngine = logView.getEngine();
    logWebEngine.getLoadWorker().stateProperty().addListener((o, oldValue, newValue) -> {
        if (newValue == Worker.State.SUCCEEDED) {
            window.set((JSObject) logWebEngine.executeScript("window"));
        }
    });
    logWebEngine.load(getClass().getResource("log.html").toString());
}

当我从 java 端调用 addLogMessage() 时,它按预期工作。 但是,调用 addLogMessages() 导致了以下异常。

线程“JavaFX 应用程序线程”java.lang.IllegalAccessException 中出现异常:类 sun.reflect.misc.Trampoline 无法使用修饰符“public”访问类 java.util.Collections$UnmodifyingCollection 的成员

看来是addLogMessages中的l.size()导致了这个异常。

这个异常的原因是什么?并且,这个问题有什么解决办法吗? 提前致谢。

最佳答案

zella 的评论对我很有帮助。

没有工作:

DatumFunction<Double> datumFunction = new DatumFunction<Double>(){

        @Override
        public Double apply(int d) {
            String result  = "" + d;
            return value;
        }

};

有效:

DatumFunction<Double> datumFunction = new DoubleDatumFunction();

public class DoubleDatumFunction implements DatumFunction<Double> {
        @Override
        public String apply(int d) {
            String result  = "" + d;
            return value;
        }
    }

如果我从第二个示例的类中删除 public 修饰符,该示例将不再有效。

关于java - 在 javascript 中使用 java 对象时出现 IllegalAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26846078/

相关文章:

text - Javafx 2.0 阿拉伯文文本顺序不正确

javascript - JS 调用堆栈总是至少有一个框架吗?

javascript - Angularjs 表单在提交时未清除

java - 如何在其他类中使用 Singleton 实例

java - 迭代值时的 HashMap 线程安全

javascript - 如何区分单击+拖动与双击+拖动

javafx - 如何使用 javafx 创建完全全屏应用程序

java - bpm activiti框架和数据库轮询

Java LocalDate 不接受所有 EpochDay 字段有效值

java - Jar 在网页中作为小程序嵌入时运行,但在使用 jnlp 方法时不运行