用Groovy構建java指令碼

來源:互聯網
上載者:User

標籤:

我是做工作流程項目的,工作流程中各個模板引擎都需要要執行一個動態業務,這些動態業務有多種實現方式,最常用的就是使用者自己寫一段指令檔,然後工作流程引擎執行到這裡的時候,運行這個指令檔。

 

這個運行指令檔的功能最初項目組是用ScriptEngineManager實現的。要求使用者提供一個實現業務的jar,並寫js指令碼,指令碼裡動態地調用java內建在js引擎裡的幾個函數,這幾個函數就是動態地調用jar裡面的業務函數。

但是這樣做太不方便,一是js無法調用java代碼,只能預置java函數,或者通過預置的java函數反射其他業務函數。同時js文法對於java程式員也太晦澀了,作為java程式員,很多對js文法不夠瞭解,甚至是誤解的。

於是js這個方式我們就棄用了,現在準備使用Groovy這門語言來做指令碼。

 

Groovy相信java開發人員都聽說過,畢竟是java的兄弟語言,他和java一樣都是基於jvm這個中介軟體的語言,關係可以類比c#.net和vb.net。和Groovy相同的基於jvm的語言也有很多,這裡就不展開了。

 

那麼使用Groovy有什麼好處呢?

1.首先需求是要求使用動態指令碼語言,調用java寫的類庫,因此語言最好是動態,這樣可以寫得更少的代碼,對於指令碼也有來說代碼長度至關重要。Groovy就是這樣一個動態語言,有閉包以及其他動態語言中的特性。這些特性我不是特別看重,主要是他的集合對象調用非常簡單,[]可以視為list對象,{}可以視為map對象,同時是弱類型的,你不需要像使用java一樣在類型轉換上花很多時間。這些對於指令碼語言來說太重要了。畢竟指令碼語言只是組織和調用java寫的業務,自己不做業務,所以不需要太好的可維護性,但是需要足夠靈活能夠簡單高效地調用業務函數。

 

2.Groovy幾乎支援java的所有文法,你可以把他直接當做java來用,這樣對於java工程師而言無疑是福音,如果你拒絕使用Groovy的動態特性,你完全可以唯寫java代碼,完全把他當java來用。

 

3.Groovy能直接調用java現有的類,也就是說你可以直接使用某個jar提供的類庫,這一點對於我們來說太重要了,直接new業務函數類,就可以調用jar裡面的業務介面了。

為了測試Groovy是否能完成以上需求,我做了一個測試demo。

首先定義一個java類,充當業務jar。

 

public class JavaFunction {public static int i = 0;public String run() {return "運行了java代碼";}}

然後直接GroovyShell測試指令碼

import groovy.lang.Binding;import groovy.lang.GroovyShell;public class GroovyScriptEngineTest {public static void main(String[] args) throws Exception {Binding binding = new Binding();binding.setVariable("javaFunction", new JavaFunction());GroovyShell gs = new GroovyShell(binding);Object value = gs.evaluate(//可以引入java類"import com.zrsoft.groovyScriptEngineTest.JavaFunction;"+ "println ‘Groovy可以直接import當前classpath裡的類!‘;"//可以寫Groovy文法的代碼。Groovy是動態語言,比java適合寫指令碼+ "println ‘運行了Groovy代碼!‘;"//可以使用java風格的Groovy,其實就是java代碼,因為Groovy支援java+ "String javaCode = \"運行了Java風格的Groovy代碼!\";"+ "System.out.println(javaCode);"//可以直接建立java自訂的對象+ "JavaFunction newJavaFunction = new JavaFunction();"+ "println \"在Groovy引擎裡建立java對象,並\" + newJavaFunction.run();"//可以呼叫指令碼預設的java對象+ "return javaFunction.run();");System.out.println("為GroovyShell預設java對象,並在Groovy裡" + value + ",同時證明Groovy可以返回變數給java。");}}

以上測試全部通過

Groovy可以直接import當前classpath裡的類!運行了Groovy代碼!運行了Java風格的Groovy代碼!在Groovy引擎裡建立java對象,並運行了java代碼為GroovyShell預設java對象,並在Groovy裡運行了java代碼,同時證明Groovy可以返回變數給java。

當然以上測試完成,還不足以讓我們確定使用Groovy做指令碼方案可行,運行效能和運行後記憶體釋放情況還需進一步考察。

用Groovy構建java指令碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.