当前位置: 首页 > news >正文

java执行JavaScriptUtil运转

  1 import javax.script.Invocable;
  2 import javax.script.ScriptEngine;
  3 import javax.script.ScriptEngineManager;
  4 import javax.script.ScriptException;
  5 import java.util.Map;
  6 import java.util.regex.Matcher;
  7 import java.util.regex.Pattern;
  8 
  9 public class JavaScriptUtil {
 10 
 11     public static Object calculateRatio(Map<String, Object> column,Map<String, Object> row) throws ScriptException, NoSuchMethodException {
 12         ScriptEngineManager manager = new ScriptEngineManager();
 13         ScriptEngine engine = manager.getEngineByName("nashorn");
 14         // 如果还是没有引擎可用,抛出明确异常
 15         if (engine == null) {
 16             if(column.get("filed") != null){
 17                 return row.get(column.get("filed"));
 18             }
 19             return "";
 20         }
 21         // 注入数据到JS环境
 22         engine.put("row", row);
 23         // 根据引擎类型使用不同的语法
 24         String formatter = column.get("formatter").toString();
 25         String converted = "function calculateRatio(row) {"+convertJsForNashorn(formatter)+"}";
 26         engine.eval(converted);
 27         // 调用函数
 28         Object result = ((Invocable)engine).invokeFunction("calculateRatio", row);
 29         return result.toString();
 30     }
 31 
 32     public static void main(String[] args) throws ScriptException, NoSuchMethodException {
 33         Map<String, Object> column = Map.of("formatter", "let { Z, V } = row; // Z=计划品, V=检验量 \n" +
 34                 "if(Z == 0){\n" +
 35                 "  return 0; \n" +
 36                 "}else{\n" +
 37                 " return parseFloat((((Z/V) * 100)).toFixed(3));\n" +
 38                 "}", "V", 100);
 39         Map<String, Object> row = Map.of("Z", 20, "V", 100);
 40         System.out.println(calculateRatio(column,row)); // 输出 25.0
 41     }
 42 
 43     /**
 44      * 转换JavaScript代码为Nashorn兼容格式
 45      * @param jsCode 原始JavaScript代码
 46      * @return 转换后的JavaScript代码
 47      */
 48     public static String convertJsForNashorn(String jsCode) {
 49         // 1. 转换let/const为var
 50         String converted = convertVariableDeclarations(jsCode);
 51 
 52         // 2. 处理解构赋值
 53         converted = convertDestructuringAssignments(converted);
 54 
 55         // 3. 其他可能的转换可以在这里添加
 56 
 57         return converted;
 58     }
 59 
 60     /**
 61      * 将let和const转换为var
 62      */
 63     private static String convertVariableDeclarations(String jsCode) {
 64         // 替换所有let和const为var,但排除函数声明中的情况
 65         String pattern = "(?<!(function\\s+|\\w+\\s*\\.))\\b(let|const)\\b";
 66         return jsCode.replaceAll(pattern, "var");
 67     }
 68 
 69     /**
 70      * 处理解构赋值转换为传统赋值
 71      */
 72     private static String convertDestructuringAssignments(String jsCode) {
 73         // 匹配类似 let { Z, V } = row; 的模式
 74         Pattern pattern = Pattern.compile("var\\s*\\{([^}]+)\\}\\s*=\\s*(\\w+)\\s*;");
 75         Matcher matcher = pattern.matcher(jsCode);
 76 
 77         StringBuffer sb = new StringBuffer();
 78         while (matcher.find()) {
 79             String variables = matcher.group(1).trim();
 80             String sourceObject = matcher.group(2).trim();
 81 
 82             // 处理每个解构变量
 83             String[] vars = variables.split(",");
 84             StringBuilder replacements = new StringBuilder();
 85 
 86             for (String var : vars) {
 87                 var = var.trim();
 88                 if (var.isEmpty()) continue;
 89 
 90                 // 处理可能的别名情况,如 { Z: alias }
 91                 if (var.contains(":")) {
 92                     String[] parts = var.split(":");
 93                     String original = parts[0].trim();
 94                     String alias = parts[1].trim();
 95                     replacements.append("var ").append(alias).append("=")
 96                             .append(sourceObject).append(".").append(original).append(";");
 97                 } else {
 98                     replacements.append("var ").append(var).append("=")
 99                             .append(sourceObject).append(".").append(var).append(";");
100                 }
101             }
102 
103             matcher.appendReplacement(sb, replacements.toString());
104         }
105         matcher.appendTail(sb);
106 
107         return sb.toString();
108     }
109 }

 

http://www.jsqmd.com/news/165799/

相关文章:

  • 5050幻彩灯珠厂家有哪些?2025专业制造商深度剖析 - 栗子测评
  • 2025水喷射真空机组哪家好?水喷射真空机组推荐及优势盘点 - 栗子测评
  • 露,AI人工智能自发活动分析系统 AI人工智能自发活动视频分析系统
  • 三雄极光全光谱照明的品牌历史、市场占有率及线下评价如何? - myqiye
  • 004 - AcidBytes2
  • 安装android studio时出现下面报错source-36_r01.zip安装失败
  • 2025工业设备精选:往复式升降机厂家与螺旋提升机厂家一览 - 栗子测评
  • 天下工厂行业标注数据更新频率是多少?动态识别,月度刷新,确保“所见即所产”
  • 2025钨酸钠生产厂家TOP5权威推荐:出货快、服务好的靠谱服务商深度测评 - 工业品网
  • 2025年优质矿石分析仪推荐,高灵敏度求推荐矿石分析仪品牌排名全解析 - 工业品牌热点
  • 机器学习065:深度学习【模型框架】PyTorch vs TensorFlow:给初学者的AI框架选择指南
  • 2025年服务不错的儿童视唱练耳机构推荐,儿童视唱练耳品牌老师解析 - mypinpai
  • JAVA分块上传组件的跨平台兼容性讨论
  • 2025最新!9个AI论文软件测评:本科生写论文痛点全解析
  • 2025北京化粪池清理服务推荐榜:和信通管道疏通有限公司,朝阳区/通州/大楼/附近/小区化粪池清理,全场景覆盖化粪池清理需求 - 品牌推荐官
  • 2025 最新!10个AI论文平台测评:本科生写论文不再愁
  • 告别无效联系!天下工厂查询工具真实体验报告
  • 震惊!ReAct智能体工作原理大揭秘,AI应用不再“一本正经地胡说八道“!
  • 爱回收 item_get_inquir - 获取询价项接口对接全攻略:从入门到精通
  • udev规则文件的作用
  • 2025年河北公共卫生间隔断安装公司推荐:公共卫生间隔断报价/商场卫生间隔断包工/铝蜂窝卫生间隔断/商场卫生间隔断包料/商场卫生间隔断服务商精选 - 品牌推荐官
  • 自考人必看!9个降AI率工具推荐,高效避坑指南
  • 2025最新淀粉衍生物三剑客推荐 TOP5:预糊化淀粉/黄糊精/白糊精合规厂家清单 - 深度智识库
  • 突发|Meta 官宣引入 Manus:创始人出任副总裁,核心团队整体并入
  • 何为 SRC?挖漏洞为何屡屡受挫?需规避哪些问题?
  • 怎样才能成为一名黑客?新手必掌握的 12 个基础步骤
  • 网络安全快速入门路径:聚焦三个关键动作,实现两个月高效突破
  • 智能装备工厂10个研发人员用SolidWorks如何共享一台服务器算力和资源
  • 寄化妆品到中国香港哪家好——竞速物流,专业邮寄化妆品,敏感货无忧直达 - 深度智识库
  • 社区公告推送小程序,输入公告信息,自动推送给小区用户,支持点赞和评论,解决社区公告传达不及时的问题。