【问题标题】:How can I access properties of Java Objects passed to scriptEngine?如何访问传递给 scriptEngine 的 Java 对象的属性?
【发布时间】:2021-08-09 18:57:59
【问题描述】:

我正在使用 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 和它的所有方法一样都是公共的,所以应该没问题吗?

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

【问题讨论】:

    标签: javascript java scriptengine graaljs


    【解决方案1】:

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

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

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

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

    感谢这个帖子的人: https://github.com/oracle/graaljs/issues/169

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 2019-06-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多