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. def add(a, b) { 
  10.     a + b 
  11.  
  12. i = 123 + 5 
  13. println
  14. m = ['name':'http://blog.chenlb.com'
  15. if(m && m.get('name')) { 
  16.     println "id="+m.get('name'
  17. println "end!" 
  18. 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[]{2, 3}); 
  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.  
package com.chenlb.groovy;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import groovy.lang.GroovyShell;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * @author http://blog.chenlb.com 2010-6-30 下午05:22:33
 */
public class GroovyT {

	public static void main(String[] args) {
		ClassLoader parent = GroovyT.class.getClassLoader();
        GroovyClassLoader loader = new GroovyClassLoader(parent);

        GroovyObject groovyObject = null;
        try {
        	File file = new File("src/groovy/baz.groovy");

        	Map<String, String> m = new HashMap<String, String>();
            m.put("name", "chenlb");

            Class<?> groovyClass = loader.parseClass(file);
            groovyObject = (GroovyObject) groovyClass.newInstance();
            System.out.println("-> "+groovyObject.getClass());

            groovyObject.setProperty("m", m);

            Object result = groovyObject.invokeMethod("foo", new Integer(2));
            System.out.println(result+" -> "+result.getClass());

            result = groovyObject.invokeMethod("add", new Object[]{2, 3});
            System.out.println(result+" -> "+result.getClass());

            result = groovyObject.invokeMethod("main", new String[]{});
            System.out.println(result);

            //run groovy
            System.out.println("=========================");
            GroovyShell gs = new GroovyShell(parent);
            gs.setVariable("m", m);
            Object r = gs.evaluate(file);
            System.out.println(r);	//102
        } catch (Exception e) {
        	e.printStackTrace();
		}
	}

}

看到这样的结果:

-> 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 行注释掉)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值