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

时间:2015-07-29 17:08:42

标签: nashorn

试试这个,看哪。这打印" undefined"然后用 TypeError失败:[inner = java.lang.Object@159f197]没有这样的功能" getBar"

现在的问题是Nashorn应该能够使用它们的名称访问数据bean属性,而不需要调用函数 - 比如a.b而不是a.getB()。但是,这个例子表明这种访问读取" undefined"而不是字符串值" localBar&#34 ;;并且底层函数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();
     }
  }
}

1 个答案:

答案 0 :(得分:3)

Nashorn只允许访问公共方法&公共课的公共领域。正如您所猜测的那样,匿名内部类不是公开的,因此Nashorn不会允许访问相同内容。评估不存在的属性会导致" undefined"。这与JS语言一致。将undefined作为函数调用会导致TypeError - 这也是ECMAScript规范。