Groovy学习:第二章 Groovy语言的关键特征
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学习:第二章 Groovy语言的关键特征的更多相关文章
- oracle学习 第二章 限制性查询和数据的排序 ——03
这里.我们接着上一小节2.6留下的问题:假设要查询的字符串中含有"_"或"%".又该如何处理呢? 開始今天的学习. 2.7 怎样使用转义(escape)操作符 ...
- 第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...
- C#语言————第二章 C#语言快速热身
第二章 C#语言快速热身 ***********一.选择结构**************** 1:if选择结构与java的if选择结构语法完全相同 2:switch选择结构 ①:常量表达式的值可 ...
- [编程笔记]第二章 C语言预备知识
/*第二讲 C语言预备专业知识 1.CPU 内存条 硬盘 显卡 主板 显示器之间的关系 CPU不能直接处理硬盘上的数据 文件存储在硬盘,当运行时,操作系统把硬盘上的数据调用到内存条上. 图像以数据的形 ...
- 《C Primer Plus》- 第二章 C语言概述
本笔记写于2020年1月27日. 本系列文章参考的是<C Primer Plus>(第六版),其中里面会有笔者自己的相关补充. 以下示例均运行于macOS Catalina 10.15.2 ...
- Java基础知识二次学习-- 第二章 基础语法与递归补充
第二章 基础语法与递归补充 时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下 ...
- Groovy学习()Groovy是啥?
Groovy是啥? groovy是英文中的一个单词,有marvelous.wonderful和excellen的意思. groovy是轻量级的,动态的,面向对象的,并且运行在JVM上的. groovy ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 第二章
Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...
- Ruby学习-第二章
第二章 类继承,属性,类变量 1.如何声明一个子类 class Treasure < Thing 这样Thing类中的属性name,description都被Treasure继承 2.以下三种方 ...
随机推荐
- navigate连接不上Centos7+mariadb的问题
链接数据库时忽然遇到一个问题.Mac Navicat链接时报错Can’t connect to MySQL server on ‘xx.xx.xx.xx’ (61). PS. win版Navicat ...
- 2018-2-13-win10-uwp-BadgeLogo-颜色
title author date CreateTime categories win10 uwp BadgeLogo 颜色 lindexi 2018-2-13 17:23:3 +0800 2018- ...
- 解决git status中文路径乱码
这个问题就放一张图吧: 不过需要注意,这样设置了之后对 git status 命令输出的路径就不做转义处理了,当路径中有空格等被terminal视为特殊字符的内容时不要直接复制粘贴使用.
- shortcut to add throws declaration in Intellij Idea
When a piece of code needs error handling, IntelliJ underlines it with red. Set your pointer on that ...
- 解决Minikube start卡住的方法
安装与问题 在mac上安装minikube对k8s进行学习,根据官方Quick Start brew cask install minikube 就可以完成minikube的安装 在安装前需要安装vi ...
- redis还要做
RedisTemplate对各种数据类型的操作记录. Redis深度历险:核心原理和应用实践 https://www.cnblogs.com/kismetv/p/8654978.html
- 四、Angular新建组件和使用
1.新建组件命令 ng component 组件路径 如果报错换成 ng generate component 组件路径 2.组件 ts 文件详解 3.组件会自动引入到app.mudule.ts里面 ...
- spring boot集成mongodb的增删改查
添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- 线程池(ThreadPool)创建
线程池创建方式jdk1.5 Java通过Executors(jdk1.5并发包)提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活 ...
- React、Redux、React-Redux学习
React 是什么 用脚本进行DOM操作的代价很昂贵.有个贴切的比喻,把DOM和JavaScript各自想象为一个岛屿,它们之间用收费桥梁连接,js每次访问DOM,都要途径这座桥,并交纳"过 ...