我需要在ScriptEngine - 或ScriptContext - 级别配置一些属性,以便在Java方法中使用。
那么,如何获取对ScriptContext
的引用以便检索值?
示例:设置属性:
public static void main(String[] args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.getContext().setAttribute("param1", "paramValue", ScriptContext.ENGINE_SCOPE);
engine.put("MyWindow", engine.eval("Java.type(\"" + MyWindow.class.getName() + "\")"));
engine.eval("print(new MyWindow().test());");
}
MyWindow
实施:如何获取该属性?
public class MyWindow {
public String test() {
// how to get 'param1' value here
return "in test";
}
}
答案 0 :(得分:1)
传递给:
engine.eval("print(new MyWindow().test(param1));");
// ^^^^^^
// vvvvvvvvvvvvv
public String test(String param1) {
// how to get 'param1' value here
return "in test";
}
<强>更新强>
如果您的代码包含javaMethod1 -> JavaScript -> javaMethod2
之类的调用堆栈,并且希望javaMethod1
的值可用于javaMethod2
,则不用更改JavaScript要传递它,请使用ThreadLocal。
由于您的代码位于main
,您可以直接使用static
,但我假设您的上下文更复杂。下面的代码甚至可以在多线程上下文中使用。 ThreadLocal
可以存储在任何地方,只需要是静态的,并且可用于两种java方法。
public static void main(String[] args) throws Exception {
MyWindow.param1.set("paramValue");
try {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("var MyWindow = Java.type(\"" + MyWindow.class.getName() + "\");" +
"print(new MyWindow().test());");
} finally {
MyWindow.param1.remove();
}
}
public class MyWindow {
public static final ThreadLocal<String> param1 = new ThreadLocal<>();
public String test() {
String value = param1.get();
return "in test: param1 = " + value;
}
}