我和Groovy有了情感纠纷


上周接到了个开发数据同步中间件的需求,其中需要同步数据转换过程提供插件式的转换器,心想我哪里知道什么啥叫  插~~~~件式的转换器,所以就去苦心专研了一波百度!问:百度你知道什么啥叫   插~~~~件式的转换器吗? 答:Groovy 。 于是有了这篇文章



你以为这是个凄美的爱情故事?

漏!

大漏特漏!


1.谁是Groovy

百度百科上是这样写的:Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库。

1.2 可以用Groovy来做什么?

  1. 可以通过groovy编写脚本与java相结合,实现动态编译,插件化的效果。
    1. 举个例子在数据转换的过程中,这里面的数据转换针对某些数据是需要进行十分复杂的操作的,并不是简简单单的进行映射或者是拼接截断,那么这个时候就希望有一个插件,我通过插件编写进行复杂转换。这样做的好处是动态,灵活,同时避免二次编码及其带来的不可预见的风险
    2. 向我们公司的分布式任务调度系统xxl-job中 ,执行器的类型有BEAN、GLUE(JAVA)模式。其中GLUE(JAVA)模式就是通过Groovy的方式与我们自己的项目集成起来的,这个地方要注意的是,如果你要引入项目内其他包的下类,记得Import一下!

2.Groovy基础语法

上面说到Groovy是一种基于JVM的敏捷开发语言,用java的语法肯定是没有多少大问题的。有时候甚至可以省略掉一些编写,下面是Groovy的小改动:

  1. 不需public修饰符: Groovy的默认访问修饰符就是public,如果Groovy类成员需要public修饰,则根本不用写它。
  2. 不需要类型说明: 同样前面也说过,Groovy也不关心变量和方法参数的具体类型。
  3. **不需要getter/setter方法: ** 在很多ide(如eclipse)早就可以为程序员自动产生getter/setter方法了,在Groovy中,不需要getter/setter方法–所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果一定要通过getter/setter方法访问成员属性,Groovy也提供了它们)。
  4. 不需要构造函数:不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的构造函数–由于是map类型,通过这个参数可以构造对象时任意初始化它的成员变量)。
  5. 不需要return: Groovy中,方法不需要return来返回值。
  6. **不需要(): ** Groovy中方法调用可以省略()(构造函数除外)

2.1数据类型

Groovy提供多种内置数据类型。以下是在Groovy中定义的数据类型的列表 –

  • byte -这是用来表示字节值。例如2。
  • short -这是用来表示一个短整型。例如10。
  • int -这是用来表示整数。例如1234。
  • long -这是用来表示一个长整型。例如10000090。
  • float -这是用来表示32位浮点数。例如12.34。
  • double -这是用来表示64位浮点数,这些数字是有时可能需要的更长的十进制数表示。例如12.3456565。
  • char -这定义了单个字符文字。例如“A”。
  • Boolean -这表示一个布尔值,可以是true或false。
  • String -这些是以字符串的形式表示的文本。例如,“Hello World”的。

类型除了基本类型,还允许以下对象类型(有时称为包装器类型)-

  • java.lang.Byte
  • java.lang.Short
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Float
  • java.lang.Double

此外,以下类可用于支持高精度计算 –

名称 描述 例如
java.math.BigInteger 不可变的任意精度的有符号整数数字 30克
java.math.BigDecimal 不可变的任意精度的有符号十进制数 3.5克

2.2 其他

太多了,其他语法请看 https://www.w3cschool.cn/groovy/groovy_overview.html

2.3总结

如果不想看的话,你怎么写java的就怎么写groovy!

想当初林平之也是先自宫,学到最后一页才发现,不自宫也是可以的我和Groovy有了情感纠纷我和Groovy有了情感纠纷我和Groovy有了情感纠纷

3.在Java中使用

/**
* 方式一,使用GroovyClassLoader调用
*
@param scriptText
@param func
@param objs
@param <T>
@return
@throws IllegalAccessException
@throws InstantiationException
*/

public static <T> invoke01(String scriptText, String func, Object... objs) throws IllegalAccessException, InstantiationException {
    GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
    Class groovyClazz = groovyClassLoader.parseClass(scriptText);

    GroovyObject groovyObject = (GroovyObject) groovyClazz.newInstance();
    Object result = groovyObject.invokeMethod(func, objs);
    return (T) result;
}


/**
* 方式二,使用ScriptEngine调用
*
@param scriptText
@param func
@param objs
@param <T>
@return
@throws ScriptException
@throws NoSuchMethodException
*/

public static <T> invoke02(String scriptText, String func, Object... objs) throws ScriptException, NoSuchMethodException {
    ScriptEngine scriptEngine = new GroovyScriptEngineFactory().getScriptEngine();
    scriptEngine.eval(scriptText);
    Object result = ((Invocable) scriptEngine).invokeFunction(func, objs);
    return (T) result;
}

/**
* 使用GroovyShell调用(推荐)
*
@param scriptText
@param func
@param objs
@param <T>
@return
*/

public static <T> invoke03(String scriptText, String func, Object... objs) {
    GroovyShell groovyShell = new GroovyShell();
    Script script = groovyShell.parse(scriptText);
    Object result = InvokerHelper.invokeMethod(script, func, objs);
    return (T) result;
}


原文始发于微信公众号(Hephaestuses):我和Groovy有了情感纠纷

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/44996.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!