首页 > 解决方案 > 如何访问传递给 scriptEngine 的 Java 对象的属性?

问题描述

我正在使用 engine.put() 方法将对象传递给 scriptEngine,并尝试使用 engine.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 和它的所有方法一样都是公共的,所以应该没问题吗?

任何帮助理解这一点或解决方案将不胜感激。

标签: javascriptjavascriptenginegraaljs

解决方案


经过一些进一步的研究,似乎 graal.js 默认情况下不会像您期望的那样映射属性,但如果您在 nashorn 兼容模式下运行它,则可以这样做。

System.setProperty("polyglot.js.nashorn-compat", "true");

完成此操作后,您可以像在 JavaScript 中一样检索对象属性:

engine.eval("console.log(transformContext.dataRecordsByName)");

感谢这个线程上的人: https ://github.com/oracle/graaljs/issues/169


推荐阅读