如何在Nashorn中获取一个名为method的配置属性

时间:2015-08-24 01:32:28

标签: java nashorn

我需要在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";
    }
}

1 个答案:

答案 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;
    }
}