【问题标题】:Do GraalVM JavaScript's JS-to-Java object conversions contain type information?GraalVM JavaScript 的 JS 到 Java 对象转换是否包含类型信息?
【发布时间】:2022-02-04 19:35:15
【问题描述】:

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

我发现,GraalVM JavaScript 的内部函数对我来说毫无用处。例如,JSProxy.isJSProxy 仅在传递JSProxyObject 的实例时才返回true。 Oracle 的 documentation 这么说

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

TruffleMap 没有出现在GraalVM JavaScript 的源代码中,并且在GraalVM 的源代码中只出现了一次,所以它很可能已被弃用,但那是多余的,因为表示方法可能是相同的。

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

【问题讨论】:

    标签: javascript java graalvm graaljs


    【解决方案1】:

    说实话,你的问题让我很困惑,但你只是在寻找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;
            }
        }
    }
    

    【讨论】:

    • 甚至没有关闭。任何从 JavaScript 传递到 Java 的对象都将转换为相同的包装类。
    • 也许举个例子会让你的问题更清楚。
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多