试试这个,看哪。这打印" 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();
}
}
}
答案 0 :(得分:3)
Nashorn只允许访问公共方法&公共课的公共领域。正如您所猜测的那样,匿名内部类不是公开的,因此Nashorn不会允许访问相同内容。评估不存在的属性会导致" undefined"。这与JS语言一致。将undefined作为函数调用会导致TypeError - 这也是ECMAScript规范。