首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java对象的GraalJs调用构造函数

java对象的GraalJs调用构造函数
EN

Stack Overflow用户
提问于 2020-05-16 22:46:03
回答 2查看 940关注 0票数 1

我想使用graal js为我的应用程序提供一些脚本扩展。

如何在javascript端初始化一个新的java对象?

代码语言:javascript
复制
Context ctx = Context ctx = Context.newBuilder().allowHostAccess(HostAccess.ALL).allowAllAccess(true).build().create();
Value binding = ctx.getBindings("js");
binding.putMember("ArrayList", ArrayList.class);
ctx.eval("js","let list = new ArrayList();list.add(\"1\")");
List list = binding.getMember("list").as(List.class);
assert list.size() == 1;

下面的代码引发异常

代码语言:javascript
复制
Exception in thread "main" TypeError: instantiate on JavaClass[java.util.ArrayList] failed due to: Message not supported.
    at <js> :program(Unnamed:1:13-27)
    at org.graalvm.polyglot.Context.eval(Context.java:371)

运行graalvm-ce-java11 11 19.3.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-17 09:43:58

您需要使用Java.type

下面是从https://www.graalvm.org/docs/reference-manual/polyglot/获取的一个示例

代码语言:javascript
复制
var array = new (Java.type("int[]"))(4);
array[2] = 42;
console.log(array[2])

下面是一个用GraalVM 20.0.0测试的完全可运行的示例

代码语言:javascript
复制
import org.graalvm.polyglot.*;

class M {
    public static void main(String[] args) {
        try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
            java.util.ArrayList v = context.eval("js",
            "var ArrayList = Java.type('java.util.ArrayList');" +
            "var list = new ArrayList();" + 
            "list.add(1); list").asHostObject();
            System.out.println(v.get(0));
            assert v.get(0).equals(1);
        }
    }
}

同跑

代码语言:javascript
复制
graalvm-ce-java8-20.0.0/bin/javac M.java 
graalvm-ce-java8-20.0.0/bin/java -ea M

以获得1作为输出。

票数 1
EN

Stack Overflow用户

发布于 2021-03-09 08:21:08

您还可以使用sj4js库。在这里,您可以定义构造函数,这些构造函数可以无缝地融入JS。

代码语言:javascript
复制
// we create a new JS engine and add
// TestClass as a constructor. This constructor is added to globalThis such that it
// can be called as a costructor.
try (JScriptEngine engine = new JScriptEngine(new JsGlobalThis(),"gt")) {
    engine.addConstructor(new TestClass("empty"));
            
    /* call your js code here */
}

你的JS代码看起来像这样,你会料到的。

代码语言:javascript
复制
// we create a new variable from the constructor
var tc = new TestClass("test");

console.log(tc.name)
// test
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61844602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档