gpt4 book ai didi

java - Nashorn - 找不到 ScriptObject 和 MyInterface 的通用类加载器

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

我最近将我的 java 版本从 java 1.7 升级到了 java 1.8。升级后我收到此错误。

原因:ECMAScript 异常:类型错误:找不到 ScriptObject 和我的接口(interface)的通用类加载器。

请帮我解决这个问题。

下面是我的方法

private final ScriptEngine engine;
ScriptEngineManager sem = new ScriptEngineManager();
engine = sem.getEngineByName("nashorn");

public <K> K getNewInterface(MyScript myScript){
ScriptContext ctx = new SimpleScriptContext();
String script = myScript.getScript();
if(Strings.isEmpty(script)) {markInvalid(myScript, "Script is empty", null); return null;}
script += " (function(){return this;})();";
Object thiz;
try{
thiz = engine.eval(script, ctx);
} catch (ScriptException e){
markInvalid(myScript, "Can't execute script", e);
return null;
}
if(thiz==null) {markInvalid(myScript, "Script executed, but context is null", null); return null;}
K ret = (K) ((Invocable)engine).getInterface(thiz, myScript.getScriptInterfaceClass());
if(ret==null) {
markInvalid(myScript, "Script executed, but it's incompatible with required interface", null);
return null;
}else{
myScript.setValid(true);
return ret;
}
}

最佳答案

为了让 Nashorn 实现您的接口(interface),它必须(在运行时)创建一个新类,该类既扩展 ScriptObject (Nashorn 的内部原生 JS 对象表示)和您的接口(interface)(比方说它被命名为MyInterface)。

只有存在可以解析 ScriptObjectMyInterface 的类加载器时,才能在 JVM 中创建这样的类。由于 ScriptObject 通常存在于 ext 类路径 (jre/lib/ext) 中(在 Java 8 中),因此您需要确保 MyInterface 的类加载器code> 在其父类加载器链中有所谓的“ext 类加载器”。这通常是正确的,因为大多数代码是由 JVM 应用程序类加载器加载的。如果您有更复杂的类加载器设置(例如,您位于某种应用程序容器中),则可能不是这样。

基本上,看看这是否有效(我认为周围没有安全管理器......):

ClassLoader myClassLoader = myScript.getScriptInterfaceClass().getClassLoader();
Class.forName("jdk.nashorn.internal.runtime.ScriptObject", true, myClassLoader);

如果它抛出 ClassNotFoundException,您需要找出为什么 myClassLoader 没有看到 ScriptObject 类。

关于java - Nashorn - 找不到 ScriptObject 和 MyInterface 的通用类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40877274/

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