[转]java 中调用 groovy

[转]java 中调用 groovy

原文出处: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 行注释掉)。





你可能感兴趣的:([转]java 中调用 groovy)