javascript - 如何访问传递给 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 和它的所有方法一样都是公共的,所以应该没问题吗?
任何帮助理解这一点或解决方案将不胜感激。
解决方案
经过一些进一步的研究,似乎 graal.js 默认情况下不会像您期望的那样映射属性,但如果您在 nashorn 兼容模式下运行它,则可以这样做。
System.setProperty("polyglot.js.nashorn-compat", "true");
完成此操作后,您可以像在 JavaScript 中一样检索对象属性:
engine.eval("console.log(transformContext.dataRecordsByName)");
推荐阅读
- javascript - 允许在页面加载时播放音频
- python - 将输出写入不同的 csv 文件列
- python - 从 numpy 数组在 PyQt5 中显示图像
- python - 如何修复 sklearn for python 安装失败
- android-studio - 在 Google Play 商店中上传 Ionic 项目的错误
- python - 尝试创建 Twitter 情绪分析,我收到此错误 AttributeError: 'str' object has no attribute 'csv'
- python - 在 Pandas 列中过滤列表中的项目
- r - 使用R中的函数从服务器下载数据时利用for循环?
- go - 使用反射的接口的指针接收器更新函数中结构的字段
- java - 我应该在 android studio 中为类似的回收器视图编写多个适配器吗?