如何在 Nashorn 中获取配置的属性调用方法
How to get a configured attribute in Nashorn called method
我需要在 ScriptEngine- or 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";
}
}
传入:
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
, 无需 [=30] =] 更改 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;
}
}
我需要在 ScriptEngine- or 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";
}
}
传入:
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
, 无需 [=30] =] 更改 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;
}
}