hk2000c技術(shù)專(zhuān)欄

          技術(shù)源于哲學(xué),哲學(xué)來(lái)源于生活 關(guān)心生活,關(guān)注健康,關(guān)心他人

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            111 隨筆 :: 1 文章 :: 28 評(píng)論 :: 0 Trackbacks

          原文出處:http://blog.chenlb.com/2010/06/java-invoke-groovy.html

          java 結(jié)合 xml 是多年經(jīng)典組合。但我覺(jué)得變化多的、配置復(fù)雜的、靈活的系統(tǒng),xml 簡(jiǎn)直就是惡夢(mèng)。因?yàn)榕渲脧?fù)雜的系統(tǒng)需要點(diǎn)編程能力。而 xml 沒(méi)有編程能力,那么動(dòng)態(tài)語(yǔ)言在這需求上發(fā)揮很好的作用。比如規(guī)則引擎?,F(xiàn)在先簡(jiǎn)單示例下 java 中使用 groovy。

          java 中執(zhí)行 groovy 寫(xiě)的邏輯。

          1. println 'start!'  
          2. def foo(abc) {  
          3.     if(m && m.get('name')) {  
          4.         println "hello "+m.get('name')  
          5.     }  
          6.     println "param = "+abc  
          7.     return abc*10  
          8. }  
          9.   
          10. def add(a, b) {  
          11.     a + b  
          12. }  
          13.   
          14. i = 123 + 5  
          15. println i  
          16. m = ['name':'http://blog.chenlb.com']  
          17. if(m && m.get('name')) {  
          18.     println "id="+m.get('name')  
          19. }  
          20. println "end!"  
          21. return 100+2  

          java 的調(diào)用示例:

          1. package com.chenlb.groovy;  
          2.   
          3. import groovy.lang.GroovyClassLoader;  
          4. import groovy.lang.GroovyObject;  
          5. import groovy.lang.GroovyShell;  
          6.   
          7. import java.io.File;  
          8. import java.util.HashMap;  
          9. import java.util.Map;  
          10.   
          11. /** 
          12.  * @author http://blog.chenlb.com 2010-6-30 下午05:22:33 
          13.  */  
          14. public class GroovyT {  
          15.   
          16.     public static void main(String[] args) {  
          17.         ClassLoader parent = GroovyT.class.getClassLoader();  
          18.         GroovyClassLoader loader = new GroovyClassLoader(parent);  
          19.   
          20.         GroovyObject groovyObject = null;  
          21.         try {  
          22.             File file = new File("src/groovy/baz.groovy");  
          23.   
          24.             Map<String, String> m = new HashMap<String, String>();  
          25.             m.put("name", "chenlb");  
          26.   
          27.             Class<?> groovyClass = loader.parseClass(file);  
          28.             groovyObject = (GroovyObject) groovyClass.newInstance();  
          29.             System.out.println("-> "+groovyObject.getClass());  
          30.   
          31.             groovyObject.setProperty("m", m);  
          32.   
          33.             Object result = groovyObject.invokeMethod("foo", new Integer(2));  
          34.             System.out.println(result+" -> "+result.getClass());  
          35.   
          36.             result = groovyObject.invokeMethod("add", new Object[]{23});  
          37.             System.out.println(result+" -> "+result.getClass());  
          38.   
          39.             result = groovyObject.invokeMethod("main", new String[]{});  
          40.             System.out.println(result);  
          41.   
          42.             //run groovy  
          43.             System.out.println("=========================");  
          44.             GroovyShell gs = new GroovyShell(parent);  
          45.             gs.setVariable("m", m);  
          46.             Object r = gs.evaluate(file);  
          47.             System.out.println(r);  //102  
          48.         } catch (Exception e) {  
          49.             e.printStackTrace();  
          50.         }  
          51.     }  
          52.   
          53. }  

          看到這樣的結(jié)果:

          -> class baz
          hello chenlb
          param = 2
          20 -> class java.lang.Integer
          5 -> class java.lang.Integer
          start!
          128
          id=http://blog.chenlb.com
          end!
          null
          =========================
          start!
          128
          id=http://blog.chenlb.com
          end!
          102

          調(diào)用方法用 GroovyObject 使用 groovy 中的方法。GroovyObject 又用 GroovyClassLoader 加載。如果方法中要使用到上下文,可以用groovyObject.setProperty設(shè)置。

          還默認(rèn)有個(gè) main 個(gè)方法,些方法是執(zhí)行 groovy 文件的,但沒(méi)有返回值,因?yàn)樗褂?java 的 main(void) 方法,執(zhí)行 main 方法 groovyObject.setProperty 無(wú)效(這也可以理解 main 是靜態(tài)的)。

          也可以用 GroovyShell 來(lái)執(zhí)行 groovy 文件。這種方式可以得到返回值,可以用 setVariable 設(shè)置上下文環(huán)境(驗(yàn)證有效,把 baz.groovy 的 16 行注釋掉,同時(shí)把 GroovyT.java 的 27-40 行注釋掉)。



          posted on 2011-11-10 05:37 hk2000c 閱讀(1070) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): groovy

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 正镶白旗| 剑阁县| 额济纳旗| 沁水县| 大理市| 江北区| 麦盖提县| 文昌市| 弥勒县| 通渭县| 垣曲县| 芜湖县| 扶沟县| 内乡县| 桃源县| 武平县| 安福县| 溧水县| 麦盖提县| 海原县| 梅州市| 安达市| 湾仔区| 沅江市| 二连浩特市| 宜都市| 克拉玛依市| 兴安县| 萝北县| 茂名市| 青铜峡市| 高唐县| 石柱| 宝清县| 抚州市| 驻马店市| 苍梧县| 三原县| 囊谦县| 花莲县| 朔州市|