上周接到了个开发数据同步中间件的需求,其中需要同步数据转换过程提供插件式的转换器,心想我哪里知道什么啥叫 插~~~~件式的转换器,所以就去苦心专研了一波百度!问:百度你知道什么啥叫 插~~~~件式的转换器吗? 答:Groovy 。 于是有了这篇文章
你以为这是个凄美的爱情故事?
漏!
大漏特漏!
1.谁是Groovy
百度百科上是这样写的:Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库。
1.2 可以用Groovy来做什么?
-
可以通过groovy编写脚本与java相结合,实现动态编译,插件化的效果。
2.Groovy基础语法
上面说到Groovy是一种基于JVM的敏捷开发语言,用java的语法肯定是没有多少大问题的。有时候甚至可以省略掉一些编写,下面是Groovy的小改动:
-
不需public修饰符: Groovy的默认访问修饰符就是public,如果Groovy类成员需要public修饰,则根本不用写它。 -
不需要类型说明: 同样前面也说过,Groovy也不关心变量和方法参数的具体类型。 -
**不需要getter/setter方法: ** 在很多ide(如eclipse)早就可以为程序员自动产生getter/setter方法了,在Groovy中,不需要getter/setter方法–所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果一定要通过getter/setter方法访问成员属性,Groovy也提供了它们)。 -
不需要构造函数:不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的构造函数–由于是map类型,通过这个参数可以构造对象时任意初始化它的成员变量)。 -
不需要return: Groovy中,方法不需要return来返回值。 -
**不需要(): ** 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!
想当初林平之也是先自宫,学到最后一页才发现,不自宫也是可以的
3.在Java中使用
/**
* 方式一,使用GroovyClassLoader调用
*
* @param scriptText
* @param func
* @param objs
* @param <T>
* @return
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static <T> 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> 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> 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