我将使用 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/