如何在 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;
    }
}