使用 Java 脚本设置 Java 字段

using Javascript to set Java fields

直接在Java类中设置变量似乎不起作用。为什么不?什么是正确的语法?变量去哪儿了??

下面打印出 2 和 1。因此根据 Foo 的对象 ff.x=2; 从未发生过。

@Test
    public void testJS2Java() throws IOException, ScriptException, Exception {
        ScriptEngineManager factory = new ScriptEngineManager();// create JavaScript engine
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        class Foo {
            int x = 1;
        }
        Foo f = new Foo();
        engine.put("f", f);
        System.out.println(engine.eval("f.x=2;"));
        System.out.println(f.x);
    }

f.x=2; 执行没有错误,但是设置了哪个 x

您的测试存在三个问题:

  1. Nashorn 只允许访问 public public classes 的成员(来自 仅用于 jdk9+) 的导出模块。本地 class Foo 是 不是 public。因此无法从 JavaScript.
  2. 访问其成员
  3. Nashorn 仅允许从“Java 类型访问 static 成员 对象”,而不是 Java 类型的实例。(不同于 Java)。
  4. 如果 no public,Nashorn 将忽略 Java 对象上的 属性 集 找到具有适当 setter 的字段或 public bean 属性。

演示从 Nashorn 访问静态 Java 字段的工作示例:

import javax.script.*;

public class Main {
    public static int x = 10;
    public static void main(String[] args) throws Exception {
        ScriptEngine e = new ScriptEngineManager().
            getEngineByName("JavaScript");

        // access type object for Java class "Main" using Java.type
        e.eval("var M = Java.type('Main');");

        // access public static field 'x' of Main class
        e.eval("print(M.x)");

        // assign to public static field 'x' of Main class
        e.eval("M.x += 10;");

        // change is seen from Java
        System.out.println(Main.x);
    }
}