加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

groovy代码动态加载运行实战

发布时间:2020-12-14 16:39:04 所属栏目:大数据 来源:网络整理
导读:Groovy是什么: 它是新一代java,也是运行在JVM中,有自己更简练的语法,更像脚本语言,但是其也支持JAVA语法 1. 插件安装 打开idea, preferences - Plugins - 搜索Groovy,找到然后点击安装;如果没有搜到,那么添加repositories: http://dist.codehaus.o

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

class 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,"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,"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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读