gpt4 book ai didi

javascript - 使用 Javascript 设置 Java 字段

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:46 25 4
gpt4 key购买 nike

直接在 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 成员(来自仅用于 jdk9+) 的导出模块。本地类 Foo 是不公开。所以它的成员不能从 JavaScript 访问。
  2. Nashorn 只允许从“Java 类型”访问静态 成员对象”,而不是来自 Java 类型的实例。(不同于 Java)。
  3. 如果 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);
}
}

关于javascript - 使用 Javascript 设置 Java 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49636791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com