允许javascript控制某些环境事物

时间:2019-01-26 15:03:03

标签: javascript java java-11 graalvm

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

我可以将Java对象提供给javascript文件吗,在javascript中我要编写类似的内容

shrek.shedLayer();

当我的Java程序执行该语句时,就等同于它(该Java程序)已直接运行

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

或其他。

1 个答案:

答案 0 :(得分:0)

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

Here's的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()来引用它们,例如,下面是一个JS snippet which uses Java's BigInteger

const BigInteger = Java.type('java.math.BigInteger');
var text = BigInteger.valueOf(10).pow(100)
          .add(BigInteger.valueOf(43)).toString();