使用 Java 脚本设置 Java 字段
using Javascript to set Java fields
直接在Java类中设置变量似乎不起作用。为什么不?什么是正确的语法?变量去哪儿了??
下面打印出 2 和 1。因此根据 Foo
的对象 f
,f.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
?
您的测试存在三个问题:
- Nashorn 只允许访问 public public classes 的成员(来自
仅用于 jdk9+) 的导出模块。本地 class Foo 是
不是 public。因此无法从 JavaScript.
访问其成员
- Nashorn 仅允许从“Java 类型访问 static 成员
对象”,而不是 Java 类型的实例。(不同于 Java)。
- 如果 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);
}
}
直接在Java类中设置变量似乎不起作用。为什么不?什么是正确的语法?变量去哪儿了??
下面打印出 2 和 1。因此根据 Foo
的对象 f
,f.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
?
您的测试存在三个问题:
- Nashorn 只允许访问 public public classes 的成员(来自 仅用于 jdk9+) 的导出模块。本地 class Foo 是 不是 public。因此无法从 JavaScript. 访问其成员
- Nashorn 仅允许从“Java 类型访问 static 成员 对象”,而不是 Java 类型的实例。(不同于 Java)。
- 如果 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);
}
}