hk2000c技術專欄

          技術源于哲學,哲學來源于生活 關心生活,關注健康,關心他人

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            111 隨筆 :: 1 文章 :: 28 評論 :: 0 Trackbacks

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

          java 結合 xml 是多年經典組合。但我覺得變化多的、配置復雜的、靈活的系統,xml 簡直就是惡夢。因為配置復雜的系統需要點編程能力。而 xml 沒有編程能力,那么動態語言在這需求上發揮很好的作用。比如規則引擎。現在先簡單示例下 java 中使用 groovy。

          java 中執行 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 的調用示例:

          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. }  

          看到這樣的結果:

          -> 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

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

          還默認有個 main 個方法,些方法是執行 groovy 文件的,但沒有返回值,因為它使用 java 的 main(void) 方法,執行 main 方法 groovyObject.setProperty 無效(這也可以理解 main 是靜態的)。

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



          posted on 2011-11-10 05:37 hk2000c 閱讀(1067) 評論(0)  編輯  收藏 所屬分類: groovy

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 罗田县| 柳江县| 中卫市| 甘肃省| 胶州市| 洞口县| 临武县| 永福县| 舞阳县| 新乡县| 东乡| 峨眉山市| 黄冈市| 股票| 巧家县| 临海市| 旬阳县| 寿宁县| 武威市| 衡南县| 南部县| 河西区| 鹤岗市| 赫章县| 荃湾区| 乌兰察布市| 喀喇沁旗| 湖北省| 鄢陵县| 浏阳市| 鲁甸县| 贞丰县| 牟定县| 福泉市| 大理市| 华蓥市| 当阳市| 石门县| 肇庆市| 武隆县| 周口市|