java 转 groovy_[转]java 中调用 groovy

java 结合 xml 是多年经典组合。但我觉得变化多的、配置复杂的、灵活的系统,xml 简直就是恶梦。因为配置复杂的系统需要点编程能力。而 xml 没有编程能力,那么动态语言在这需求上发挥很好的作用。比如规则引擎。现在先简单示例下 java 中使用 groovy。

java 中执行 groovy 写的逻辑。

println 'start!'

def foo(abc) {

if(m && m.get('name')) {

println "hello "+m.get('name')

}

println "param = "+abc

return abc*10

}

def add(a, b) {

a + b

}

i = 123 + 5

println i

m = ['name':'http://blog.chenlb.com']

if(m && m.get('name')) {

println "id="+m.get('name')

}

println "end!"

return 100+2

java 的调用示例:

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 m = new HashMap();

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、付费专栏及课程。

余额充值