hk2000c技術(shù)專欄

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

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

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

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

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

          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 文件的,但沒有返回值,因?yàn)樗褂?java 的 main(void) 方法,執(zhí)行 main 方法 groovyObject.setProperty 無效(這也可以理解 main 是靜態(tài)的)。

          也可以用 GroovyShell 來執(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)  編輯  收藏 所屬分類: groovy

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


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 邹城市| 拉萨市| 崇左市| 平泉县| 南康市| 沭阳县| 澜沧| 松原市| 南江县| 额敏县| 洮南市| 张掖市| 吉木萨尔县| 勃利县| 平谷区| 庄河市| 乳源| 洛南县| 四川省| 高青县| 绥棱县| 乌鲁木齐县| 上高县| 海兴县| 汤阴县| 神池县| 黔西县| 清流县| 河西区| 舒城县| 庄浪县| 侯马市| 台前县| 左贡县| 镇平县| 永州市| 黔西| 顺平县| 临城县| 荣成市| 莱西市|