1. 程式人生 > >Java中動態執行JS指令碼

Java中動態執行JS指令碼

很多時候在比較兩個數都已經知道了採用什麼比較符,業務的重心放在用一個變數去和另外一個變數進行比較得出結果。例如下面的例子:

public static int compare(int param1, int param2) {
        if(param1>param2){
            return 2;
        } else if(param1==param2){
            return 1;
        } else {
            return 0;
        }
    }

然而在有些場景下面,操作符可能變成了變數,這個時候還能玩得轉嗎,答案是確定的。請看下面的例子:

public class Test {
    
    public enum Operator{
        EQ("="), LT("<"), GT(">");
        
        private final String value;
        
        private Operator(String value) {
            this.value = value;
        }
        
        public String getValue() {
            return value;
        }
    }

    public static void main(String[] args) throws ScriptException {
        System.out.println(dynamicCompare("3", "4", Operator.GT.getValue()));
    }
    
    public static boolean dynamicCompare(String leftVal, String rightVal, String oper) throws ScriptException {
        String str = leftVal + oper + rightVal;
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("js");
        //scriptEngine.put("a", 4);
        return (boolean)scriptEngine.eval(str);
    }
}

通過上面的程式碼就可以得出3和4比較大家的結果,結果以布林型的值返回。


ScriptEngine除了能動態執行條件判斷語句外,還可以執行js的函式,支援入參和返回值。

public static void execScriptFun(String money) throws NoSuchMethodException, ScriptException {
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("js");
        
        String script = "function printSalary(money) { return 'My salary is:' + money }";
        scriptEngine.eval(script);
        Invocable invocable = (Invocable) scriptEngine;
        System.out.println(invocable.invokeFunction("printSalary", money));
        
    }

可以寫個main函式測試下,會打印出工資。

本文主要闡述了Java可以執行JavaScript指令碼,通過這種方式可以讓程式能更靈活,有時候可以產生意想不到的結果。