应用Java实现JS脚本引擎

我的项目地址

https://github.com/GitHub-Laz...

  • 反对解析js脚本生成语法树
  • 反对运行残缺js脚本
  • 反对平安模式运行单行表达式
  • 反对设置超时工夫

打包后命令行运行

git clone https://github.com/GitHub-Laziji/js-engine.gitcd js-enginemvn packagecd targetjava -jar ./js-engine-1.0-SNAPSHOT-jar-with-dependencies.jar ./test.js

或者装置后间接引入依赖

git clone https://github.com/GitHub-Laziji/js-engine.gitcd js-enginemvn install
<dependency>    <groupId>org.laziji.commons</groupId>    <artifactId>js-engine</artifactId>    <version>1.0-SNAPSHOT</version></dependency>

1. 生成语法树 并输入格式化代码

示例代码

class Test{    public static void main(String[] args){        Top.init();        DocNode doc = Top.compile("let      a=1+2,b=3,c=\"string\",d=a*(b+c/2),func=function(){};");        System.out.println(doc);    }}

输入

let a = 1 + 2, b = 3, c = "string", d = a * (b + c / 2), func = function () {}

2. 运行残缺脚本

以下示例为运行快排算法(运行环境线程隔离)

示例代码

class Test{    /**     * function sort(arr, i, j) {     *   if (i >= j) {     *     return;     *   }     *   let p = i, q = j;     *   let temp = arr[p];     *   while (p < q) {     *     while (p < q && arr[q] >= temp) {     *       q-=1;     *     }     *     arr[p] = arr[q];     *     while (p < q && arr[p] <= temp) {     *       p+=1;     *     }     *     arr[q] = arr[p];     *   }     *   arr[q] = temp;     *   sort(arr, i, q - 1);     *   sort(arr, q + 1, j);     * }     *     * let arr = [234, 57, 12, 123, 346, 1234, 2];     *     * sort(arr, 0, arr.length - 1);     */    public static void main(String[] args){        Top.init();        Top.eval("function sort(arr, i, j) {\n" +                "    if (i >= j) {\n" +                "        return;\n" +                "    }\n" +                "    let p = i, q = j;\n" +                "    let temp = arr[p];\n" +                "    while (p < q) {\n" +                "        while (p < q && arr[q] >= temp) {\n" +                "            q-=1;\n" +                "        }\n" +                "        arr[p] = arr[q];\n" +                "        while (p < q && arr[p] <= temp) {\n" +                "            p+=1;\n" +                "        }\n" +                "        arr[q] = arr[p];\n" +                "    }\n" +                "    arr[q] = temp;\n" +                "    sort(arr, i, q - 1);\n" +                "    sort(arr, q + 1, j);\n" +                "}\n" +                "\n" +                "let arr = [234, 57, 12, 123, 346, 1234, 2];\n" +                "\n" +                "sort(arr, 0, arr.length - 1);");        Top.loop();        System.out.println(Top.getThreadLocalTop().getMainContexts().getContexts().peek().toSimpleString());    }}

输入

arr: [2, 12, 57, 123, 234, 346, 1234]sort: [object Object]

3. 运行单行表达式

该模式下只反对单行表达式 并且无奈应用for、while、function、lambda、import关键字

示例代码

class Test{    public static void main(String[] args){        Top.init();        System.out.println(Top.exprEval("'hello '+(1*2*3*4)"));    }}

输入

hello 24

4. 设置超时工夫

通过Top.getThreadLocalTop().setOvertime(100L);设置超时工夫,单位毫秒

示例代码

class Test{    public static void main(String[] args){        Top.init();        Top.getThreadLocalTop().setOvertime(100L);        Top.addInternalModules("sys", new SystemModuleValue());        Top.eval("import { print } from \"sys\";\n" +                "\n" +                "let i=1;\n" +                "while(true){\n" +                "    print(i++);\n" +                "}");        Top.loop();    }}

输入

123...org.laziji.commons.js.exception.RunException: Run timeout....