gpt4 book ai didi

java - 在 GraalVM Polyglot 上下文中从 JavaScript 访问 Java 对象

转载 作者:行者123 更新时间:2023-11-30 12:02:01 57 4
gpt4 key购买 nike

在 GraalVM CE 上运行。

openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-jvmci-19.3-b05-LTS)
OpenJDK 64-Bit GraalVM CE 19.3.0 (build 11.0.5+10-jvmci-19.3-b05-LTS, mixed mode, sharing)

案例 1:

import org.graalvm.polyglot.Context;

public class Test {

static class Data {
public String name = "HelloWorld";
public String getName() {
return this.name;
}
}

public static void main(String[] args) {
Context context = Context.newBuilder("js").allowHostAccess(true).build();
context.getBindings("js").putMember("d", new Data());

context.eval("js", "var x = d.name");

System.out.println(
context.getBindings("js").getMember("x").asString()
);
}
}

结果:

null

为什么?

据我所知,d 正确通过了:

((Data) context.getBindings("js").getMember("d").as(Data.class)).name

返回“HelloWorld”

案例 2:

context.eval("js", "d.getName()");

异常

Exception in thread "main" TypeError: invokeMember (getName) 
on JavaObject[task.Test$Data@35a3d49f (task.Test$Data)] failed due to:
Unknown identifier: getName

但是 getName 是公开的...怎么了?

最佳答案

当您使用上下文并向其添加 Java 对象时,在幕后,TruffleApi 中的 IntropLibrary 会创建一个 HostObject 并将其与该对象相关联。这意味着您不使用对象本身,而是使用包装器对象。

当您调用 getMember() 方法时,IntropLibrary 只能访问公开可用的托管对象的字段和方法。由于您的内部类具有默认访问权限(无访问修饰符),因此 API 无法找到其成员,即使它们是公开的。 (类的成员不能拥有比其类本身更广泛的访问权限)。

要解决这个问题,你所要做的就是公开你的内部类

import org.graalvm.polyglot.Context;

public class Test {

public static class Data {
public String name = "HelloWorld";
public String getName() {
return this.name;
}
}

public static void main(String[] args) {
Context context = Context.newBuilder("js").allowHostAccess(true).build();
context.getBindings("js").putMember("d", new Data());

context.eval("js", "var x = d.name;");

System.out.println(
context.getBindings("js").getMember("x").asString()
);
}
}

关于java - 在 GraalVM Polyglot 上下文中从 JavaScript 访问 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58996429/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com