Java中執行Groovy腳本

        最近項目有個需求,需要執行一個方法,方法的目的是輸入一個金額XXX,根據抹零方式算出抹零後的金額,但是有個問題,困難場景:上游又獲取不到抹零的方式;下游又獲取不到XXX這個金額;這個時候需要寫一個Groovy腳本,他有一個入參變量XXX,爲抹零前的金額,我們在腳本中根據XXX、抹零方式給我計算邏輯;然後將這個腳本傳遞給上游調用。

處理方式:

下游寫Groovy腳本:

if("00".equals(molingPattern) || "10".equals(molingPattern)){ //舍掉角(規則:精確到元位,角位四捨五入)
   scriptString = "priceAfterMoling = priceBeforeMoling.setScale(0, BigDecimal.ROUND_HALF_UP);";
} else if("01".equals(molingPattern) || "11".equals(molingPattern)){//舍掉分(規則:精確到角位,分位四捨五入) 
   scriptString = "priceAfterMoling = priceBeforeMoling.setScale(1, BigDecimal.ROUND_HALF_UP);"; 
} 

上游獲取到這個腳本後,傳遞一個抹零前金額priceBeforeMoling,進行執行:
Binding binding = new Binding();  
binding.setVariable("priceBeforeMoling", BigDecimal.valueOf(99.99));
GroovyShell shell = new GroovyShell(binding);  
String scriptString = getScrpitMethod();//通過某種方式獲取到
shell.evaluate(scriptString);
BigDecimal priceAfterMoling = (BigDecimal) binding.getProperty("priceAfterMoling");
System.out.println("priceAfterMoling:"+priceAfterMoling);  

需引入jar包:
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import groovy.lang.Script;

pom.xml文件添加依賴:

<dependency>  
    <groupId>org.codehaus.groovy</groupId>  
    <artifactId>groovy</artifactId>  
    <version>2.1.6</version>  
</dependency>  
<dependency>  
    <groupId>org.codehaus.groovy</groupId>  
    <artifactId>groovy-jsr223</artifactId>  
    <version>2.1.6</version>  
</dependency>


上游處理還有另外一種寫法,給出代碼做參考:

Binding binding = new Binding();  
GroovyShell shell = new GroovyShell(binding);  
//直接方法調用  
Script script = shell.parse("def calculate(BigDecimal priceBeforeMoling) {return priceBeforeMoling.setScale(0, BigDecimal.ROUND_HALF_UP);}"); 
BigDecimal result = (BigDecimal)script.invokeMethod("calculate", BigDecimal.valueOf(0.0001));  
System.out.println(result);
根據groovy腳本方法的返回值來得到,而不是通過binding.getProperty來獲取。這種寫法對於只有一個返回值的比較方便,如果需要獲取多個值,可能上面的會好一點,至於哪個性能好,沒有測試過~

相關博文:

http://www.cnblogs.com/zz0412/p/Groovy001.html

http://blog.csdn.net/haigenwong/article/details/22947173


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章