项目地址
https://github.com/GitHub-Laziji/js-engine
- 支持解析js脚本生成语法树、格式化代码
- 支持运行完整js脚本
- 支持安全模式运行单行表达式
- 支持设置超时时间
1. 生成语法树 并输出格式化代码
示例代码
1 2 3 4 5 6 7
| 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); } }
|
输出
1 2 3
| let a = 1 + 2, b = 3, c = "string", d = a * (b + c / 2), func = function () {
}
|
2. 运行完整脚本
以下示例为运行快排算法(运行环境线程隔离)
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| class Test{
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()); } }
|
输出
1 2
| arr: [2, 12, 57, 123, 234, 346, 1234] sort: [object Object]
|
3. 运行单行表达式
该模式下只支持单行表达式 并且无法使用for、while、function、lambda、import关键字
示例代码
1 2 3 4 5 6
| class Test{ public static void main(String[] args){ Top.init(); System.out.println(Top.exprEval("'hello '+(1*2*3*4)")); } }
|
输出
4. 设置超时时间
通过Top.getThreadLocalTop().setOvertime(100L);
设置超时时间,单位毫秒
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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(); } }
|
输出
1 2 3 4 5 6 7
| 1 2 3 ...
org.laziji.commons.js.exception.RunException: Run timeout. ...
|