使用Javascript设置Java字段

问题描述 投票:3回答:1

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

以下打印出2和1.因此f.x=2;从未发生过根据fFoo对象。

@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设置?

javascript java nashorn
1个回答
2
投票

您的测试有三个问题:

  1. Nashorn仅允许访问公共类的公共成员(来自jdk9 +的导出模块)。当地的班级Foo不公开。因此无法从JavaScript访问其成员。
  2. Nashorn只允许从“Java类型对象”访问静态成员,而不能从Java类型的实例访问。 (与Java不同)。
  3. 如果找不到具有适当setter的公共字段或公共bean属性,Nashorn将忽略Java对象上的属性集。

演示从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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.