Java中動態執行JS指令碼
阿新 • • 發佈:2019-02-17
很多時候在比較兩個數都已經知道了採用什麼比較符,業務的重心放在用一個變數去和另外一個變數進行比較得出結果。例如下面的例子:
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指令碼,通過這種方式可以讓程式能更靈活,有時候可以產生意想不到的結果。