0

为了在 GraalVM JavaScript 上模仿 Node 下的一些函数util.types,我转向了可以访问Java.type的 Java 函数或 Java 包全局变量。GraalVM 具有类似的内部功能,JSProxy.isJSProxy并且JSSet.isJSSet可以执行此操作。我通过将它们标记为导出、重新编译和测试它们来使它们可访问(我使用例如,访问它们Java.type("com.oracle.truffle.js.builtins.runtime.JSProxy").isJSProxy)。

我发现,GraalVM JavaScript 的内部函数对我来说毫无用处。例如,JSProxy.isJSProxytrue在传递JSProxyObject. 甲骨文的文档

JavaScript 对象作为com.oracle.truffle.api.interop.java.TruffleMap. 这个类实现了 Java 的 Map 接口。

TruffleMap 没有出现在GraalVM JavaScript的源代码中,并且只出现在GraalVM的源代码中一次,因此它很可能已被弃用,但这并不重要,因为表示方法可能是相同的。

无论 JS 对象的外部 Java 端表示是什么,它是否包含有关 JavaScript 端对象类型的信息?我可以确定它是否是 JS 代理吗?我可以确定它是否是一个Set对象吗?(对于原生 JavaScript 对象类型,依此类推。)

4

1 回答 1

0

老实说,您的问题让我很困惑,但是您只是在寻找instanceof运营商吗?

import org.graalvm.polyglot.*;
import org.graalvm.polyglot.proxy.*;

public class Test {
    public static class MyClass {
        public int id = 42;
    }

    public static void main(String[] args) {
       try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
            context.getBindings("js").putMember("javaObj", new MyClass());
            boolean valid = context
              .eval("js", "javaObj instanceof Java.type('Test$MyClass')")
              .asBoolean();
            assert valid;
        }
    }
}
于 2022-02-05T10:07:25.073 回答