目录 start
目录 end
|2018-06-20| 码云 | CSDN | OSChina
实战Groovy系列
有体系的知识
精通Groovy Groovy:Java 程序员的 DSL w3cschool Groovy教程 并发编程网 Groovy分类文章 infoQ 上Groovy相关
Groovy in Action
在线阅读英文原版
sdk install groovy
println "Hello World!"
然后 groovy 文件
groovy -e "println 'Hello World!'"
因为构建工具Gradle中就已经包含了Groovy的库,所以最好就是只配置好一个Gradle, 然后配置Groovy时选择Gradle的目录即可
作为一个脚本语言,和Python Ruby Smalltalk语法相似
这一些导入是默认隐含在Groovy代码中
import groovy.lang.*
import groovy.util.*
import java.lang.*
import java.io.*
import java.math.BigDecimal
import java.math.BigInteger
import java.net.*
import java.util.*
@Grab
注解或者和Java一样加入到ClassPath中去Groovy会在
代码块
的行末缺省return null, 如果末行有一个表达式, 并有返回值, 就会return该值, 略坑
类当中的属性, 只要不是使用private修饰, 就能自动生成getter setter, 并且直接
.引用
属性, 相当于调用了对应的get set
变量
def static
,因为他简化了类型重载和调度机制def private static name = "90"
Groovy里的动态类型和静态类型
作用域(通常这是指脚本状态时的普通类就是和Java一致)
ArrayList
和 LinkedHashMap
实现的
lists = ['2', 2, new Date()]
其实这个和Python的语法差不多,同样的支持负索引maps = [Java:"2", A:2]
声明Maps // 当前类, 可以这么用
def test(name) {
return "Hi "+name
}
String a = "test"
print("${a}"("myth"))
class Condition{
static isLevelMore(int level){
return level > 30
}
}
class Use {
static void main(String[]a){
// 跨类, 需要使用反射
// 1
MetaMethod method = Condition.metaClass.getMetaMethod("isLevelMore", 20)
println method
println method.invoke(Condition.class, 20)
// 2
Method method1 = Condition.class.getMethod("isLevelMore", int.class)
println method1.invoke(Condition.class, 40)
// 3
Condition.getDeclaredMethods().toList().toSet().each {if(it.toString().contains("isLevelMore")){
println it.invoke(Condition.class, 40)
}}
}
}
// 简单示例
def plus = { x, y ->
println "$x plus $y is ${x + y}"
}
plus(2, 3)
参考博客: 用 Groovy 更迅速地对 Java 代码进行单元测试
["sh", "-c", "cp src/*.txt dst/"].execute()
@ToString 自动实现toString方法, 但是字符串有点冗余
日志相关 只需要引入对应的依赖, 就和lombok一样的使用
@Log4j
@Log4j2
@Slf4j
println()
print()
printf()
语句结束处的分号
: 结束的分号是可选的,除非一行多条语句返回语句 return
: 方法中返回对象可以不使用return,会默认返回最后一个表达式的计算结果方法参数两边的括号
: 如果方法里的方法调用至少有一个参数,且没有二义性,则可以省略括号public访问限定符
: 默认是public修饰符, 只有private public protected脚本文件和类文件的差异
groovy.lang.Script
将你写的语句封装起来groovy.lang.GroovyObject
类似与Java的Object,就会当一个正常的类文件,不能写脚本了异常处理
Groovy中的相等
内部类
?.
实现null对象的安全访问GroovyBean
.
引用私有成员变量。修改默认行为显式重定义即可new Person().name="myth"
,其实就是隐式调用了set方法class Person{
String name
int age
}
安全解引用 ?.
猫王操作符
增强型字符串
函数字面值
内置集合操作
对正则表达式的内置支持
~
创建一个模式 (创建一个编译的Java Pattern)=~
创建一个匹配器 (创建一个Java Matcher对象)==~
计算字符串 (相当于在Pattern上调用Java match()方法)对XML的处理
XML是一个卓越的详细的数据交换语言,这不是一个图灵完备(必须能做条件判断,修改内存数据)的语言,所以只能用来交换数据
<!-- 添加插件-->
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>groovy-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
</plugin>
<!-- 添加Groovy依赖-->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.7</version>
</dependency>
参考博客 eclipse开发Groovy代码,与java集成,maven打包编译 | Groovy file does not compile in Intellij IDEA
<plugin>
<!-- 编译插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
<compilerId>groovy-eclipse-compiler</compilerId>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-compiler</artifactId>
<version>2.9.3-01</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-eclipse-batch</artifactId>
<version>2.5.0-01</version>
</dependency>
</dependencies>
</plugin>
这样的配置就能
mvn clean package
只要在方法最后一行放入表达式, 就会自动return, 这就导致了Groovy不会对方法进行检查, 逻辑复杂时如果少了一个return, 不会报编译错误, 方法直接返回null.
这个坑, 硬是Debug了近一个小时, debug功力要提升了