我使用Nashorn与Java制作一个模块化插件系统。插件将使用Javascript编写。一个重要的特性是具有可以用Javascript代码编写的处理程序。一开始,我的目标是制作一个简单的命令系统。javascript实现一个接口,并调用Java方法来注册命令。然而,我得到一个错误。我确保我使用的是Nashorn(var usingNashorn=typeof进口类!=="函数";
)返回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代码:调用“侦听”:
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:?]
如果我遗漏了什么,请告诉我。先谢谢你。
我会打印com的类加载器。techsdev。脚本引擎。听众。CommandListener来自脚本和Java代码。
从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: XML:
下面是托管活动片段: 有问题的行是代码段的最后一行。这是我的语录片段。 假设我对主机活动没有扩展support.v4的看法是正确的,那么我该怎么做呢?
问题内容: 应用程序版本: JBoss 7.0.0,Oracle 11g(ojdbc6.jar)和JDK 6版本 当我尝试使用函数插入CLOB数据类型的值时遇到问题,出现以下异常。 在多个论坛中搜索后,未找到任何解决方案。 https://forums.oracle.com/forums/thread.jspa?threadID=279238 完成了部署WAR文件和配置JBoss oracle驱动
我有JSON文件看起来像 所以这个键是一个字符串“SUBS_ID”,这个值是一个名为Feature细节的模型,它包含属性“特性设置名称、特性名称、...”。所以我用这样google.json库从JSON文件中读取, 然后我试图循环这个HashMap获取值,并将其转换为我的Feature细节模型, 这是我的FeatureDetails模型, 但我得到了一个例外"com.google.gson.int
问题内容: 我是Java的新手,正在尝试理解为什么第一个代码片段不会导致此异常,而第二个代码片段会导致此异常。由于在两种情况下都将字符串数组传递到Arrays.asList中,所以两个代码片段都不应该产生异常还是不产生异常? 第一个代码段(毫无例外): 第二段(导致上述异常): 如果相关,我正在Eclipse Helios中使用JavaSE 1.6。 问题答案: 对我来说(使用Java 1.6.0