什么是graalvm中的poliglotmap?

5ssjco0h  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(460)

我正在和 org.graalvm.polyglot 在java11项目中使用脚本引擎来评估javascript。
要计算的脚本返回一个包含两个条目的javascript数组。

...
var result={};
result.isValid=false;
result.errorMessage = new Array();
result.errorMessage[0]='Somehing go wrong!';
result.errorMessage[1]='Somehingelse go wrong!';
....

在java代码中,我尝试计算结果对象:

Value resultValue = context.getBindings(languageId).getMember("result");

在eclipse调试器中,我可以看到收到一个包含预期值的polyglotmap:

我可以使用如下代码迭代该Map以获取值:

...
   try {
            mapResult = resultValue.as(Map.class);
        } catch (ClassCastException | IllegalStateException | PolyglotException e) {
            logger.warning("Unable to convert result object");
            return null;
        }

        Iterator it = mapResult.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry) it.next();
            String itemName = pair.getKey().toString();
            Object itemObject = pair.getValue();
...

通过这种方式,我能够提取布尔值“isvalid”。但对于对象“errormessage”,我很挣扎。
在eclipse调试器中再次检查对象,如下所示:

如果我测试这个对象,它就是一个Map的示例。但是我无法从这个对象中获取任何值。
有人能帮我理解这个对象到底代表什么,以及我如何提取这两个值吗 'Someting go wrong!''Sometingelse go wrong!' ?
当我迭代第二个Map时,它似乎是空的——即使调试器向我显示了正确的值。

mlmc2os5

mlmc2os51#

我不是100%确定为什么 as(Map.class) 这样的话,在github上创建一个问题来解决它可能是值得的:github.com/oracle/graal
但是,如果您使用api访问这些值而不转换为Map,那么它将按照您的预期工作:

var errorMessage = resultValue.getMember("errorMessage");
errorMessage.hasArrayElements(); // true
var _0th = errorMessage.getArrayElement(0); 
var _1th = errorMessage.getArrayElement(1);

您还可以将polyglotmap转换为value,然后执行以下操作:

val errorMessage = context.asValue(itemObject);
errorMessage.hasArrayElements(); // true
errorMessage.getArrayElement(0);

polyglotmap当然有 get 方法。javadoc的值表示:

Map.class is supported if the value has Value.hasHashEntries() hash entries}, members or array elements. The returned map can be safely cast to Map. For value with members the key type is String. For value with array elements the key type is Long.

你能试着用长钥匙拿吗?我可能遗漏了一些明显的东西,所以无论如何,最好在github上提出一个问题。

相关问题