0

我想使用 GraalVM 运行用户编写的 javascript 代码(我正在编写一个 Java 11 项目)。

我可以将 Java 对象提供给 javascript 文件吗,在 javascript 中我想写类似的东西

shrek.shedLayer();

当我的 Java 程序执行这个语句时,它就相当于它(java 程序)直接运行了

someLong.pieceOf().Code();
Maybe multipleLines = new Maybe();
someLong.add(multipleLines);

管他呢。

4

1 回答 1

0

是的,您可以让您的 Java 代码评估 JavaScript。是的,您可以将 Java 对象传递给 JavaScript 上下文。是的,您可以将 JavaScript 值返回到 Java。

下面是一个 Java 代码示例,它实例化一个 JavaScript 上下文,计算一个定义函数的 JavaScript 代码字符串,将该函数存储在一个变量中,调用它并将 Java 对象作为参数传递并打印该函数调用的返回值。

import org.graalvm.polyglot.*;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class ExtListDir {
    public static void main(String[] args) throws java.io.IOException {
        final Context context = Context.create("js");
        String s = "name + ': ' + size";
        if (args.length == 1) {
            s = args[0];
        }
        final Value lambda = context.eval("js",
            "(function(name, size) { return " + s + "})");
        try (Stream<Path> paths = Files.walk(Paths.get("."))) {
            paths.filter(Files::isRegularFile).forEach((Path p) -> {
                File f = p.toFile();
                Value v = lambda.execute(f.getName(), f.length());
                System.out.println(v);
            });
        }
    }
}

如果你想在 JS 上下文中使用 Java 类,你可以用 引用它们Java.type(),例如这里是一个使用 Java 的 BigInteger 的 JS 片段

const BigInteger = Java.type('java.math.BigInteger');
var text = BigInteger.valueOf(10).pow(100)
          .add(BigInteger.valueOf(43)).toString();
于 2019-01-26T15:34:11.607 回答