无法读取从 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 规范。
试试看。这打印 "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 规范。