gpt4 book ai didi

java - Nashorn CommandListener$$NashornJavaAdapter 无法转换为 CommandListener

转载 作者:行者123 更新时间:2023-12-01 09:17:04 27 4
gpt4 key购买 nike

我正在使用 Nashorn 和 Java 来制作模块化插件系统。这些插件将用 Javascript 编写。一个重要的功能是拥有可以用 Javascript 代码编写的处理程序。一开始我的目标是制作一个简单的命令系统。 javascript实现一个接口(interface),并调用Java方法来注册命令。但是,我收到错误。我确保我使用的是 Nashorn (var usingNashorn = typeof importClass !== "function";) 返回 true。

Javascript:

var CommandListener = Java.extend(Java.type("com.techsdev.scriptengine.listeners.CommandListener"), {
invoke : function(sender, command, args) {
java.lang.System.out.println("Received a command: " + command);
}
});

var listen = function(scriptManager) {
var listener = new CommandListener();
scriptManager.registerCommand("plugin name", "test", listener);
}

Java代码:调用“listen”:

try {
engine.eval(new FileReader(f));
Invocable invocable = (Invocable) engine;
invocable.invokeFunction("listen", this);
} catch(Exception e) {
logger.error("Failed to load script "+f.getName(), e);
}

其中“f”是 Javascript 文件其中“engine”是 Nashorn ScriptEngine其中“this”是 ScriptManager

在 ScriptManager 类中,此方法负责注册实际命令:

public void registerCommand(String plugin, String command, CommandListener listener) {
if(commandHandlers.containsKey(command.toLowerCase())) {
logger.warn("Command "+command+" tried to be registered, but is already registered!");
return;
}

commandHandlers.put(command.toLowerCase(), listener);
}

但是,此代码会引发以下异常:

java.lang.ClassCastException: com.techsdev.scriptengine.listeners.CommandListener$$NashornJavaAdapter cannot be cast to com.techsdev.scriptengine.listeners.CommandListener
at com.techsdev.scriptengine.JsScriptManager.registerCommand(JsScriptManager.java:168) ~[scriptengine-mod.jar:?]
at jdk.nashorn.internal.scripts.Script$Recompilation$2$616A$\^eval\_.listen(<eval>:22) ~[?:?]
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:625) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:199) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:383) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190) ~[nashorn.jar:?]
at com.techsdev.scriptengine.JsScriptManager.loadFile(JsScriptManager.java:134) [JsScriptManager.class:?]
at com.techsdev.scriptengine.JsScriptManager.loadFolder(JsScriptManager.java:116) [JsScriptManager.class:?]
at com.techsdev.scriptengine.JsScriptManager.init(JsScriptManager.java:104) [JsScriptManager.class:?]

如果我错过了什么,请告诉我。预先感谢您。

最佳答案

我会从脚本和 Java 代码中打印 com.techsdev.scriptengine.listeners.CommandListener 的类加载器。

来自 JavaScript:

print(Java.type("com.techsdev.scriptengine.listeners.CommandListener").class.classLoader)

来自 Java:

System.out.println(com.techsdev.scriptengine.listeners.CommandListener.class.getClassLoader());

如果相同的(完全限定的)命名类字节由两个不同的加载器加载,则从 JVM 的角度来看,这些(运行时)类是不同的。如果您看到 javascript 和 java 代码中的类加载器不同,很可能存在类路径/类加载器问题。

关于java - Nashorn CommandListener$$NashornJavaAdapter 无法转换为 CommandListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470360/

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