有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

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

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

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

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