Да, вы можете заставить свой код 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);
});
}
}
}
Если вы хотите использовать классы Java из контекста JS, вы можете ссылаться на них с помощью Java.type()
, например вот фрагмент JS , который использует Java BigInteger :
const BigInteger = Java.type('java.math.BigInteger');
var text = BigInteger.valueOf(10).pow(100)
.add(BigInteger.valueOf(43)).toString();