【问题标题】:Nashorn Parser API on JDK 8JDK 8 上的 Nashorn 解析器 API
【发布时间】:2015-03-19 20:25:44
【问题描述】:

寻找用于解析 JavaScript(包括 Nashorn 扩展)的 Java/JDK API 我偶然发现了this Gist,根据内联注释,它需要运行 JDK 9。在当前或计划的 JDK 8 版本上是否有可靠的方法来完成相同的任务?

【问题讨论】:

    标签: java javascript nashorn


    【解决方案1】:

    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

    【讨论】:

    • 谢谢!从内部人员那里得到答复真是太棒了:)(您似乎是,对吗?)
    【解决方案2】:

    虽然您绝对可以通过 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);
    

    【讨论】:

    • 这是个坏主意。 jdk.nashorn.internal.* 是 nashorn 的内部实现包。这将无法在启用安全管理器的情况下运行(如果您的类不受信任)。使用 jdk9,这些甚至都没有从 nashorn 模块中导出,因此它甚至无法编译。
    • 公平点。这是我发现的另一个副作用。如果您执行上述操作,您也不能通过ScriptEngine 使用 Nashorn。最后,我创建了一个小的 js 来使用 Nashorn 本身的解析器。
    猜你喜欢
    • 2019-01-13
    • 2021-02-26
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多