当前位置: 首页 > 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.gsyq.cn/news/181320.html

相关文章:

  • 5050幻彩灯珠厂家有哪些?2025专业制造商深度剖析 - 栗子测评
  • 三雄极光全光谱照明的品牌历史、市场占有率及线下评价如何? - myqiye
  • 安装android studio时出现下面报错source-36_r01.zip安装失败
  • JAVA分块上传组件的跨平台兼容性讨论
  • 2025年优质矿石分析仪推荐,高灵敏度求推荐矿石分析仪品牌排名全解析 - 工业品牌热点
  • 机器学习065:深度学习【模型框架】PyTorch vs TensorFlow:给初学者的AI框架选择指南
  • 2025北京化粪池清理服务推荐榜:和信通管道疏通有限公司,朝阳区/通州/大楼/附近/小区化粪池清理,全场景覆盖化粪池清理需求 - 品牌推荐官
  • 告别无效联系!天下工厂查询工具真实体验报告
  • udev规则文件的作用
  • 2025年河北公共卫生间隔断安装公司推荐:公共卫生间隔断报价/商场卫生间隔断包工/铝蜂窝卫生间隔断/商场卫生间隔断包料/商场卫生间隔断服务商精选 - 品牌推荐官
  • 智能装备工厂10个研发人员用SolidWorks如何共享一台服务器算力和资源
  • 怎样才能成为一名黑客?新手必掌握的 12 个基础步骤
  • 社区公告推送小程序,输入公告信息,自动推送给小区用户,支持点赞和评论,解决社区公告传达不及时的问题。
  • leetcode 816. Ambiguous Coordinates 模糊坐标
  • 毕业论文 “无痛通关”:从选题到成稿,藏在 paperzz 毕业论文里的 4 步 “躺平式” 写作法
  • 软/硬中断计数、softnet_stat、socket 队列、吞吐量、CPU 使用率、offload状态
  • 2025年焊管厂家推荐榜:镍基合金/厚壁/不锈钢/特材/大口径/钛合金/复合不锈钢材料/直缝焊管源头厂家精选 - 品牌推荐官
  • 2026年雅思/托福机构评测榜:经济复苏驱动留学热,多次元教育以98.6分领跑行业 - 速递信息
  • 工业互联网在电池拆解中的智能化升级路径
  • Vue2 中 Options API:组织组件逻辑的主要方式
  • 手把手教你Java文件断点下载
  • 【译】Visual Studio —— 为现代开发的速度而打造
  • 先睹为快 | 2026年3月国际学术会议一览表
  • 2025北京资质齐全的汽车贴膜公司TOP5权威推荐:诚信口碑企业甄选指南 - 工业品网
  • 揭秘ReAct框架:AI Agent的’思考-行动-观察’三步舞,高效开发的秘诀!
  • 基于spring boot的钢材销售管理系统的设计与实现
  • 收藏必学!从零到精通RAG技术:大模型增强生成完全指南(附实战资源)
  • 基于Spring Boot的教育平台设计与实现
  • 基于Spring boot的洛川县苹果销售管理平台
  • 动态特征选择稳住房颤预警