|
|
@@ -3,7 +3,6 @@ package com.jjt.utils;
|
|
|
import javax.script.Invocable;
|
|
|
import javax.script.ScriptEngine;
|
|
|
import javax.script.ScriptEngineManager;
|
|
|
-import javax.script.ScriptException;
|
|
|
|
|
|
/**
|
|
|
* JavaScript工具类
|
|
|
@@ -13,56 +12,53 @@ import javax.script.ScriptException;
|
|
|
*/
|
|
|
public class JavaScriptUtil {
|
|
|
public static void main(String[] args) {
|
|
|
- System.out.println("JavaScriptUtil.main");
|
|
|
}
|
|
|
|
|
|
- public static String exec() {
|
|
|
- try {
|
|
|
- // 创建脚本引擎管理器
|
|
|
- ScriptEngineManager manager = new ScriptEngineManager();
|
|
|
+ /**
|
|
|
+ * 执行JavaScript代码并返回结果
|
|
|
+ *
|
|
|
+ * @param jsCode JavaScript代码
|
|
|
+ * @param dataArrays 数据数组
|
|
|
+ * @return 执行结果
|
|
|
+ * @throws Exception 执行异常
|
|
|
+ */
|
|
|
+ public static String exec(String jsCode, Double[]... dataArrays) throws Exception {
|
|
|
+ // 创建脚本引擎管理器
|
|
|
+ ScriptEngineManager manager = new ScriptEngineManager();
|
|
|
+ ScriptEngine engine = manager.getEngineByName("graal.js");
|
|
|
|
|
|
- // 获取GraalJS引擎
|
|
|
- ScriptEngine engine = manager.getEngineByName("graal.js");
|
|
|
+ // 替换函数名
|
|
|
+ jsCode = jsCode.replace("function", "let testFun=function");
|
|
|
|
|
|
- // 定义JavaScript函数
|
|
|
- String jsFunctions =
|
|
|
- "function add(a, b) { " +
|
|
|
- " return a + b; " +
|
|
|
- "} " +
|
|
|
- "" +
|
|
|
- "function factorial(n) { " +
|
|
|
- " if (n <= 1) return 1; " +
|
|
|
- " return n * factorial(n - 1); " +
|
|
|
- "} " +
|
|
|
- "" +
|
|
|
- "function getUserInfo(name, age) { " +
|
|
|
- " return { " +
|
|
|
- " name: name, " +
|
|
|
- " age: age, " +
|
|
|
- " birthYear: 2024 - age " +
|
|
|
- " }; " +
|
|
|
- "}";
|
|
|
+ // 转换所有数组为JavaScript数组
|
|
|
+ Object[] jsArrays = new Object[dataArrays.length];
|
|
|
+ for (int i = 0; i < dataArrays.length; i++) {
|
|
|
+ StringBuilder arrayBuilder = new StringBuilder();
|
|
|
+ arrayBuilder.append("[");
|
|
|
+ for (int j = 0; j < dataArrays[i].length; j++) {
|
|
|
+ if (j > 0) {
|
|
|
+ arrayBuilder.append(",");
|
|
|
+ }
|
|
|
+ arrayBuilder.append(dataArrays[i][j]);
|
|
|
+ }
|
|
|
+ arrayBuilder.append("]");
|
|
|
+ String jsArrayStr = arrayBuilder.toString();
|
|
|
|
|
|
- // 执行脚本,注册函数
|
|
|
- engine.eval(jsFunctions);
|
|
|
+ // 设置变量并保存引用
|
|
|
+ String varName = "javaData" + (i + 1);
|
|
|
+ engine.eval("var " + varName + " = " + jsArrayStr + ";");
|
|
|
+ jsArrays[i] = engine.get(varName);
|
|
|
+ }
|
|
|
|
|
|
- // 转换为Invocable来调用函数
|
|
|
- Invocable invocable = (Invocable) engine;
|
|
|
+ // 执行脚本,注册函数
|
|
|
+ engine.eval(jsCode);
|
|
|
|
|
|
- // 调用add函数
|
|
|
- Object addResult = invocable.invokeFunction("add", 15, 25);
|
|
|
- System.out.println("15 + 25 = " + addResult);
|
|
|
+ // 转换为Invocable来调用函数
|
|
|
+ Invocable invocable = (Invocable) engine;
|
|
|
|
|
|
- // 调用factorial函数
|
|
|
- Object factorialResult = invocable.invokeFunction("factorial", 5);
|
|
|
- System.out.println("5! = " + factorialResult);
|
|
|
+ // 调用函数,传递所有数组
|
|
|
+ Object result = invocable.invokeFunction("testFun", jsArrays);
|
|
|
|
|
|
- // 调用返回对象的函数
|
|
|
- Object userInfo = invocable.invokeFunction("getUserInfo", "张三", 25);
|
|
|
- System.out.println("用户信息: " + userInfo);
|
|
|
- } catch (ScriptException | NoSuchMethodException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return "JavaScriptUtil.exec";
|
|
|
+ return result.toString();
|
|
|
}
|
|
|
}
|