javascript如何访问传递给scriptEngine的Java对象的属性?
我正在使用脚本引擎将对象传递给脚本引擎。方法,并尝试使用引擎检索所述对象的属性。eval()方法。然而,我似乎无法访问它们,因为对象在放入引擎时似乎丢失了它的方法,而我通常在Javascript中使用的get()方法似乎也失败了
try {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js");
engine.put("transformContext",transformContext);
engine.put("dataRecordsByName",transformContext.getDataRecordsByName());
//These three all return what I'm expecting - 2x the whole object and then just dataRecordsByName property
System.out.println(engine.get(transformContext));
System.out.println(engine.eval("print(transformContext"));
System.out.println(engine.get(dataRecordsByName));
//These throw errors get() and getDataRecordsByName() seemingly do not exist for transformContext in the engine
System.out.println(engine.eval("print(transformContext.getDataRecordsByName())"));
System.out.println(engine.eval("print(transformContext.get('dataRecordsByName'))"));
}catch(Exception e){
System.err.println("Error evaluating script: "+e.getMessage());
}
我读到scriptEngine只从公共类导入公共方法。在这种情况下,TransformContext和它的所有方法一样是公共的,所以这样就可以了
如果您能帮助理解这一点或解决方案,我们将不胜感激
# 1 楼答案
经过进一步的研究,似乎格拉尔。默认情况下,js不会像您期望的那样映射属性,但如果您在nashorn兼容模式下运行它,则可以这样做
System.setProperty("polyglot.js.nashorn-compat", "true");
完成此操作后,您可以像在JavaScript中一样检索对象属性:
engine.eval("console.log(transformContext.dataRecordsByName)");
感谢这条线上的人: https://github.com/oracle/graaljs/issues/169