Java使用JS引擎运行字符串脚本代码

206 阅读1分钟

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.regex.Matcher;
public class Cal {
    public static Object jsObjFunc(String jsStr,String function,Object... args) {
        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine scriptEngine = sem.getEngineByName("js");
        try {
            scriptEngine.eval(jsStr);
            Invocable inv2 = (Invocable) scriptEngine;
            return  inv2.invokeFunction(function,args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String... args) {
        String reg = "(\\$\\{.+?\\})";
        Pattern p=Pattern.compile(reg); 
        String calTest = "${old}>${newold}?3>2?'123':'456':'${<55}'";
        Matcher m=p.matcher(calTest); 
        Map map = new HashMap<>();
        map.put("old","56");
        map.put("newold","56");
  
        while(m.find()) {
            String temp = m.group();
            String sq = temp.substring(2);
            String ov = sq.substring(0, sq.length() - 1);
            System.out.println("裁切完:"+ov);
            if(map.containsKey(ov)) {
                System.out.println("准备替换"+map.get(ov).toString());
                calTest = calTest.replace(temp,map.get(ov).toString());

            }
        }

        System.out.println("计算表达式:"+calTest);
        String jsStr ="function myFuc(param){return eval(param) }";
        System.out.println(jsObjFunc(jsStr,"myFuc",calTest));
    }
}