1. 断言Assertion
断言:用于判断预期的条件是否为真。
例子:
def list = [1,2,'x']
assert list.size()==3
2. AST转换期使用的注释
AST转换的注释:Groovy提供了在AST转换时的注释,比如@Singleton注释。
当Groovy编译器编译Groovy脚本和类时,Groovy解析器(编译器的前端)会在为类创建最终的字节码之前创建一个抽象语法树AST,AST是源码在内存中的表现形式,比较类、方法、属性、语句、变量等。
@Singleton
class SomeSingleton
{
// ...
}
@Singleton注释指示编译器创建一个私有的构造函数和一个静态方法,在AST转换时产生一个单态实例。
简单地测试了一下:
@Singleton class SomeSingleton{ // } def s = SomeSingleton.getInstance() s.class.methods.each{ println it }
执行后输出了:
public void SomeSingleton.setProperty(java.lang.String,java.lang.Object) public java.lang.Object SomeSingleton.getProperty(java.lang.String) public static SomeSingleton SomeSingleton.getInstance() //注意这里 public groovy.lang.MetaClass SomeSingleton.getMetaClass() public void SomeSingleton.setMetaClass(groovy.lang.MetaClass) public java.lang.Object SomeSingleton.invokeMethod(java.lang.String,java.lang.Object) public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll()
3. 建立器Builder
在Java中要生成一个最简单的XML文档都是很费劲、费时的。Groovy通过内建的Builder类简化了XML的生成。如下面的例子所示:
def builder = new groovy.xml.MarkupBuilder()
builder.employee{
name 'John Doe'
gender 'male'
}
执行后输出:
<employee>
<name>John Doe</name>
<gender>male</gender>
</employee>
Result: employee
4. 闭包Closure
闭包:Groovy的闭包是一个可重用块,包含在大括号{}中,闭包可以被赋值给属性或变量,或作为参数传递给方法。
例:
def name = 'Chris'
def printClosure = { println "Hello, ${name}" }
printClosure()
name = "Li Sir"
printClosure()
执行后,代码输出:
Hello, Chris
Hello, Li Sir
5. GDK
Groovy是由完整的Groovy语言、Groovy指定的库和GDK共同组成。GDK是现有JDK基础上的Groovy扩展。GDK = Groovy JDK
详细内容可参考:http://groovy.codehaus.org/groovy-jdk/
6. 元编程Metaprogramming
元编程:意味着写一个程序来创建、查询和操纵其它的程序或者是自身。元编程既可以出现在编译时,也可出现在运行时。
编译时元编程的契约是字节码的生成。在Groovy中,编译时元编程使得你可以在产生最终的字节码之前修改AST。
在Groovy中,运行时的元编程是使用元对象协议实现的。
例:
String.metaClass.firstUpper = {->
return delegate[0].toUpperCase() + delegate[1..delegate.length()-1]
}
println "iiii".firstUpper()
执行代码,输出:
Iiii
7. 本地JSON支持
本地JSON支持:JSON是轻量级的数据交换格式,用于替代XML,作为网络上结构化数据的传输和序列化。
如下面的读JSON例子:
import groovy.json.JsonSlurper
def slurper = new JsonSlurper()
def result = slurper.parseText('{"person":{"name":"John Doe","age":40,"cars":["BMW","FORD"]}}')
println result.person.name
println result.person.age
println result.person.cars.size()
println result.person.cars[0]
println result.person.cars[1]
执行代码的结果如下:
John Doe
40
2
BMW
FORD
8. 本地支持Lists和Maps集合
Groovy增强和改进了Java集合类的声明语法和附带的方法。Groovy为List和Map包含了第一级的构造,还添加了新集合类型:Range。
例子:
authors = ['Vishal','Chris','Joseph','Jim']
println authors
println authors[0]
程序输出:
[Vishal, Chris, Joseph, Jim]
Vishal
9. 本地支持正则表达式
10. Groovy只有对象
在Groovy中,一切都是对象,没有原子类型。
在Groovy中,所有的操作符都是方法调用。
11. 字符串插值
字符串插值:是字符串内替代表达式或变量的一种能力。Java不支持字符串插值,必须手动的连接值。
例子:
def lastName = "Layka"
def fullname = "Vishal ${lastName}"
println fullname
输出:
Vishal Layka
12. 静态和动态类型
静态和动态类型:Groovy在声明变量时支持静态和动态类型。动态类型使用def关键词。
比如:
def var = 10
var = 'It's a String"
可见,定义的类型可变。
13. 静态类型检查
静态类型检查:Groovy 2.0引入了@TypeChecked注释,它可以对需要进行静态类型检查的方法或类进行注释。
import groovy.transform.TypeChecked
void doIt(){}
@TypeChecked
void test(){
dott() //compilation error:cannot find matching method dott()
}
程序运行时提示错误信息:
1 compilation error:
[Static type checking] - Cannot find matching method ConsoleScript15#dott(). Please check if the declared type is right and if the method exists.
at line: 5, column: 3
14. 静态编译
静态编译:Groovy 2.0通过@CompileStatic注释使得静态编译成为可能。此模式消除了运行时的动态调度的开销。
例如:
import groovy.transform.CompileStatic
@CompileStatic
int doubleIt(int num){
2*num
}
assert doubleIt(3) == 6
使用@CompileStatic注释将会静态的编译代码,产生的字节码和Java字节码运行的一样快。此注释可以注释类和方法。
15. 可选语法
访问修饰符:在Groovy中,类无访问修饰符则被认为是public;而属性无访问修饰符则认为是private。方法无访问修饰符则认为是public。
而在Java中,方法和域默认是包访问范围。
16. 检查异常
检查异常:在Groovy中,检查异常无需声明或捕获,Groovy会自动封装异常作为RuntimeException。
17. Getters和Setters
Groovy引入了GroovyBeans,它支持属性的直接使用,与public域相似。
18. 导入语句
默认情况下,Groovy总是导入以下的包:
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.util.regex.*
java.net.*
java.io.*
java.math.BigDecimal, java.math.BigInteger
19. 圆括号()和分号
圆括号()和分号:在Groovy中都是可选的。
20. 返回类型和return关键字
返回类型和return关键字:它是方法中的最后一条语句,而且return关键字是可选的。最后一条语句的结果值总是会返回方法调用。
如果def关键字被用于返回类型,那么Groovy会在运行时动态地计算返回类型——取决于具体返回的值。
例如:
def greeting(){
result = "Hello world"
result
}
println greeting()
输出结果为:
Hello world
相关推荐
##### 第二部分:Groovy库的应用 - **第8章:使用构建器工作**:介绍了Groovy中的构建器,这是一种用于创建复杂对象结构的简化方式。 - **第9章:使用GDK工作**:深入探讨了Groovy动态语言工具包(GDK),这是一个...
### Groovy and Grails ...通过这些章节的学习,读者将能够全面了解Groovy编程语言和Grails框架,并掌握如何使用它们来开发高效、可维护的应用程序。无论是新手还是有经验的开发者,都能从中获得宝贵的知识和实践经验。
《Grails开源项目教学代码第二部分》是针对Groovy和Grails编程语言的深入学习资源,旨在帮助开发者进一步掌握这两个强大的工具。Groovy是一种简洁、动态的Java平台上的编程语言,它提供了更简单的语法和更高的生产力...
- 极简的构建脚本:Gradle 使用 Groovy 语言编写构建脚本,这种脚本语言简洁易懂。 - 动态任务定义:允许在构建过程中动态定义任务。 - 并行构建执行:通过并行执行任务来提高构建速度。 - 高效缓存机制:Gradle...
在【第二节 Gradle快速入门】中,首先介绍了领域特定语言(DSL),它是为了解决特定领域问题而设计的语言,比如Gradle的构建脚本就是一种DSL。然后,课程提到了Groovy,Groovy是Gradle的基础,它是一种基于JVM的动态...
第二章通过多个实际案例探讨了DSL在不同场景下的应用情况。这些案例涵盖了从简单的配置文件到复杂的业务规则处理等多个层面。通过对这些案例的研究,读者可以更好地理解DSL如何帮助简化复杂的业务流程,并提高软件...
- **Gradle**: 基于Groovy语言的构建工具。 - **MSBuild**: 微软提供的.NET项目构建工具。 ##### 2.4 持续集成/持续部署工具 - **Jenkins**: 最流行的开源CI/CD工具之一,支持多种插件扩展。 - **Bamboo**: ...
第二章深入到JVM的技术层面,包括如何在不同操作系统上安装和配置JDK,JDK的构成,Java类库的结构,以及如何设置类路径(ClassPath)来运行JVM应用程序。这部分对于开发者来说,是实际操作的基础知识。 第三章则专注...
#### 第二章:集成开发环境(IDE) 集成开发环境(IDE)是软件开发过程中必不可少的工具之一,它为开发者提供了一个集成的工作环境,包含了编写、调试、编译等多种功能。 - **常见的IDE**: - **Eclipse**:开源且...
- **Groovy 与 Spring**:探讨 Groovy 脚本语言如何与 Spring 结合使用。 - **脚本引擎**:介绍 Spring 提供的脚本引擎支持。 - **动态编程**:讨论如何利用脚本支持进行动态编程。 #### 二十三、Spring 应用监控...
- **Gradle**:一种基于Groovy语言的构建工具,提供灵活的构建脚本定义方式。 - **Ant**:Apache Ant是一种纯Java编写的构建工具,适合于简单的构建任务。 4. **测试工具**: - **JUnit**:Java编程语言的单元...
**第二章:自定义GORM映射和强制数据完整性** - **通过约束实现数据完整性**:介绍了GORM如何通过各种约束机制来确保数据的正确性和一致性。 - **指定约束**:展示了如何为域类属性定义不同类型的约束,例如唯一性...
根据提供的文件信息,我们可以深入探讨该文档所涵盖的关键知识点,主要围绕iReport工具及其与JasperReports的关系。以下是对这些知识点的详细解析: ### 一、引言 #### 1.1 iReport的特点 iReport是一款强大的...