将java对象传递给js时Graalvm未知标识符

问题描述

我正在尝试运行此 Graalvm 示例代码

package org.homi.scripting.experimental;
import org.graalvm.polyglot.*;
import java.nio.file.*;
import static java.nio.file.StandardWatchEventKinds.*;


import java.io.File;
import java.io.IOException;
public class ScriptEngine {
    
    public static class Name {
        @HostAccess.Export public String name = "hello";

        @HostAccess.Export
        public String getName() {
            return name;
        }
    }
    
    
    
    
    
    
    public static void main(String[] args) {
        Name n = new Name();
        Context context = Context.newBuilder("js")
                .allowAllAccess(true)
                .allowIO(true)
                .allowpolyglotAccess(polyglotAccess.ALL)
                .build();
        context.getpolyglotBindings().putMember("name",n);
        context.eval("js","var name = polyglot.import('name');");
        context.eval("js","console.log(name.getName())");
        
        
    }
}




我收到此异常:

Exception in thread "main" TypeError: invokeMember (getName) on org.homi.scripting.experimental.Name@2313052e Failed due to: UnkNown identifier: getName
    at <js> :program(Unnamed:1:12-25)
    at org.graalvm.sdk/org.graalvm.polyglot.Context.eval(Context.java:379)
    at ScriptEngine/org.homi.scripting.experimental.ScriptEngine.tester(ScriptEngine.java:43)
    at ScriptEngine/org.homi.scripting.experimental.ScriptEngine.main(ScriptEngine.java:29)

我是 graalvm 的新手,我做错了什么?我从文档中关注了这个演示(请参阅主机互操作性部分): https://www.graalvm.org/sdk/javadoc/

解决方法

代码和堆栈跟踪不匹配,例如代码缺少tester方法

    at ScriptEngine/org.homi.scripting.experimental.ScriptEngine.tester(ScriptEngine.java:43)

当您指定 allowAllAccess(true) 时,您将允许所有访问,因此不再需要 HostAccess。

问题中的代码对我有用,并按预期打印你好。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...