我将使用 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() 会导致以下异常。
Exception in thread "JavaFX Application Thread" java.lang.IllegalAccessException: Class sun.reflect.misc.Trampoline can not access a member of class java.util.Collections$UnmodifiableCollection with modifiers "public"
似乎l.size()
在 addLogMessages 中导致了这个异常。
这个异常的原因是什么?而且,这个问题有什么解决方案吗?提前致谢。