无法读取从 Java 作为函数参数传递的对象的属性?

Failure to read properties from object passed from Java as a function argument?

试试看。这打印 "undefined" 然后失败 TypeError: [inner=java.lang.Object@159f197] has no such function "getBar"

现在这里的问题是 Nashorn 应该能够使用名称访问数据 bean 属性,而不需要调用函数——比如 a.b 而不是 a.getB()。然而,这个例子表明这种访问读取 "undefined" 而不是字符串值 "localBar";底层函数 getBar() 根本不可见! 由于覆盖了 toString(),异常消息证明从 Java 调用 foo.getBar() 工作正常。

发生了什么事?

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class NashornJS {
public static void main(String[] args) throws Exception {
      ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
      ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("nashorn");

      final String localBar = "localBar";
      final Object foo = new Object() {
        public final String getBar() { return localBar; }
        @Override public String toString() { return "[inner="+getBar().toString()+"]"; }
      };

     try {
      scriptEngine.eval("function test(foo) { print(foo.bar); print(foo.getBar()); }");
      ((Invocable)scriptEngine).invokeFunction("test", foo);
     } catch (final ScriptException se) {
      se.printStackTrace();
     }
  }
}

Nashorn 仅允许访问 public 方法和 public class 的 public 字段。如您所料,匿名内部 class 不是 public,因此 Nashorn 不允许访问它。计算一个不存在的 属性 结果为 "undefined"。那是符合JS语言的。将 undefined 作为函数调用会导致 TypeError - 这又符合 ECMAScript 规范。