groovy代码动态加载运行实战

来源:互联网 发布:女生网络名称大全 编辑:程序博客网 时间:2024/05/16 06:18

Groovy是什么:

它是新一代java,也是运行在JVM中,有自己更简练的语法,更像脚本语言,但是其也支持JAVA语法


1. 插件安装

打开idea, preferences -> Plugins -> 搜索Groovy,找到然后点击安装;如果没有搜到,那么添加repositories:http://dist.codehaus.org/groovy/distributions/update/


2. 创建groovy项目

2.1 New -> Project -> Java Project 创建一个java项目

2.2 New -> Groovy Class  创建groovy类,后缀为.groovy

import java.text.SimpleDateFormatclass GrvyCalculator {    //groovy语法    def discount(a,b){        def c = a * b    }    //java语法    int add(int a, int b){        return a + b;    }    //java语法    String add(Map<Integer, String> map){        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        Date dateValue = sdf.parse("2017-12-08 08:00:00");        String var1 = map.get(0);        String var2 = map.get(1);        String var3 = map.get(2);        StringBuilder sb = new StringBuilder();        return sb.append(var1).append("_").append(var2).append("_").append(var3).append("_").append(dateValue.format("yyyy-MM-dd HH:mm:ss"));    }}


2.3 添加maven依赖

<dependency>    <groupId>org.codehaus.gmaven.runtime</groupId>    <artifactId>gmaven-runtime-1.8</artifactId>    <version>1.4</version>    <exclusions>        <exclusion>            <groupId>org.codehaus.groovy</groupId>            <artifactId>groovy-all</artifactId>        </exclusion>        <exclusion>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>        </exclusion>    </exclusions></dependency><dependency>    <groupId>org.codehaus.groovy</groupId>    <artifactId>groovy-all</artifactId>    <version>1.8.7</version>    <exclusions>        <exclusion>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>        </exclusion>    </exclusions></dependency>





3. 实例化groovy类,并调用方法,新建java测试类

方式一: new一个groovy对象

public class GroovyTest {    public static void main(String[] args){        Map<Integer, String> map = Maps.newHashMap();        map.put(0, "a");        map.put(1, "b");        map.put(2, "c");        Calculator calculator = new Calculator();        System.out.println("discount=" + calculator.discount(10, 0.8));        System.out.println("add=" + calculator.add(1,2));        System.out.println("addStr=" + calculator.addStr(map));    }}

结果:

discount=8.0
add=3
addStr=a_b_c

 

方式二:用GroovyClassLoader动态编译Groovy类并实例化

public static void main(String[] args){        Map<Integer, String> map = Maps.newHashMap();        map.put(0, "a");        map.put(1, "b");        map.put(2, "c");        ClassLoader cl = new CalculatorTest().getClass().getClassLoader();        GroovyClassLoader grvyCl = new GroovyClassLoader(cl);        //将上面新建的Calculaotr.groovy类的代码放到grvyCalculatorFile的本地文件中        String grvyClassConcent = FileHelper.readFileContent("/Users/jimmy.wj/Documents/work/grvyCalculatorFile");        Class groovyClass = grvyCl.parseClass(grvyClassConcent);        try {            GroovyObject grvyObj = (GroovyObject) groovyClass.newInstance();            System.out.println("addStr=" + grvyObj.invokeMethod("addStr", map));        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        }    }

结果:invokeMethod方法只有两个参数,第一个参数是方法名,第二个参数是方法的入参,类型是Object;其他两个方法因为有多个入参,这里不适用。

addStr=a_b_c


4. 用GroovyClassLoader动态编译Groovy代码片段

groovy方法可以单独存在,不一定要写在class中,比如我在本地文件grvyPartFile中仅把addStr方法的代码放进去,用上述的方法二,一样可以实例化groovy对象(应该是个匿名类)

public static void main(String[] args){        Map<Integer, String> map = Maps.newHashMap();        map.put(0, "a");        map.put(1, "b");        map.put(2, "c");        ClassLoader cl = new CalculatorTest().getClass().getClassLoader();        GroovyClassLoader grvyCl = new GroovyClassLoader(cl);        //将上面新建的Calculaotr.groovy类的代码放到grvyPartFile的本地文件中        String grvyClassConcent = FileHelper.readFileContent("/Users/jimmy.wj/Documents/work/grvyPartFile");        Class groovyClass = grvyCl.parseClass(grvyClassConcent);        try {            GroovyObject grvyObj = (GroovyObject) groovyClass.newInstance();            System.out.println("addStr=" + grvyObj.invokeMethod("addStr", map));        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        }    }
结果:

addStr=a_b_c



推荐groovy的入门文章,基本语法整理的不错

http://blog.csdn.net/kmyhy/article/details/4200563





阅读全文
0 0
原创粉丝点击