【发布时间】:2015-03-19 20:25:44
【问题描述】:
寻找用于解析 JavaScript(包括 Nashorn 扩展)的 Java/JDK API 我偶然发现了this Gist,根据内联注释,它需要运行 JDK 9。在当前或计划的 JDK 8 版本上是否有可靠的方法来完成相同的任务?
【问题讨论】:
标签: java javascript nashorn
寻找用于解析 JavaScript(包括 Nashorn 扩展)的 Java/JDK API 我偶然发现了this Gist,根据内联注释,它需要运行 JDK 9。在当前或计划的 JDK 8 版本上是否有可靠的方法来完成相同的任务?
【问题讨论】:
标签: java javascript nashorn
Nashorn Parser API (http://openjdk.java.net/jeps/236) 是 jdk9 特定的 API。在 jdk8 或 jdk8 更新中,支持脚本解析器功能。
load("nashorn:parser.js");
并从脚本中调用“parse”函数。此函数返回一个 JSON 对象,该对象代表已解析脚本的 AST。
查看此示例:http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn/file/bfea11f8c8f2/samples/astviewer.js
【讨论】:
虽然您绝对可以通过 Nashorn 的 JavaScript 使用解析器,但在 Java 中通过 JAVA API 使用它会更好
import jdk.nashorn.api.scripting.ScriptUtils;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ECMAException;
import jdk.nashorn.internal.runtime.ErrorManager;
import jdk.nashorn.internal.runtime.options.Options;
// set up the environment
Options options = new Options("nashorn");
options.set("anon.functions", true);
options.set("parse.only", true);
options.set("scripting", true);
ErrorManager errors = new ErrorManager();
Context contextm = new Context(options, errors, Thread.currentThread().getContextClassLoader());
Context.setGlobal(contextm.createGlobal());
// then for each bit of parsing
String parseTree = ScriptUtils.parse(some_code_string, "nashorn", false);
【讨论】:
ScriptEngine 使用 Nashorn。最后,我创建了一个小的 js 来使用 Nashorn 本身的解析器。