1. groovy是什么
groovy是运行在java虚拟机上的具有象Python,Ruby和Smalltalk语言特性的灵活动态语言。实际上它并非脚本语言,因为在运行时它也被编译成了字节码,运行在JVM上,它和java可以无缝的结合使用,你可以认为他是java语言的另一种表现形式,但它更灵活,简洁。
groovy不是行执行的,它是编译成整个class文件执行的,可以这样认为,groovy本质上是新加了一个类加载器,它在运行时编译groovy代码为字节码,使之产生动态的行为。
2004年,groovy通过了JSR-241,groovy成为了java 平台的第二个标准语言(第一个是java 语言)
2. 编译和运行groovy
学习groovy可以用命令行的groovy或者GroovyConsole一个swing写的窗口程序。
写的groovy脚本可以直接用groovy解析执行:
写道
> groovy sum.groovy
编译groovy为字节码:
写道
> groovyc -d classes sum.groovy
运行编译好的groovy脚本:
写道
java -cp %GROOVY_HOM E%/embeddable/groovy-all.jar;classes sum
你会发现其实就是运行java的class文件
3. groovy语言
由于groovy和java及其相似,这里只介绍groovy特别的语法。
3.1 groovy调用方法可以不用括号,语句不用分号(;)结尾(当然也可以加分号)
f = Math.floor 3.14
println "f is: ${f}" // ${f} will be replaced with f's value
你会发现这里我们也没import java.util.Math,System.out,因为groovy已经import了以下的包和类:
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.net.*
java.io.*
java.math.BigInteger
java.math.BigDecimal
3.2 Class
groovy默认的访问修饰符是public
class SumCal {
private int to;
SumCal(int to) {
this.to = to;
}
int getSum() {
int s = 0;
1..to.each { i->
s += i;
}
return s;
}
}
sc = new SumCal(10);
println sc.getSum();
3.3 groovy beans
groovy的bean只需要声明属性,groovy会自动生成get/set方法,
class User {
int id;
String name;
String getName() {
return name.capitalize();
}
}
def user = new User();
user.id = 10231; // call user.setId()
user.name = 'jamson'; // call user.setName()
println user.name; // call user.getName()
输出:
写道
Jamson
可见,并非对属性的直接访问,而是调用了get/set方法,是不是比java beans方便很多呢?
3.4 一切皆对象
学习Java的时候你可能听到这句话,但java里的原始类型,如int,boolean等不是对象。在groovy里,所有的皆是对象,不论是原始类型还是常量,甚至是一段代码,都会编译成一个对象。
'alpha'.center 10,'-'
10.plus(2)
groovy里你既可以静态的指定类型,也可以不指定,即动态类型。但指定了静态类型,就不能赋值为不同的类型。
a=1
a='cc'
int c = 3
c='ccs' //compile failure
3.5 操作符重载
还记得C++里面的操作符重载吗?groovy也引进了这个特性。
class Complex {
private final int v;
private final int i;
Complex(int v, int i) {
this.v = v;
this.i = i;
}
boolean equals(Object o) {
if (null == o) return false;
if (!o instanceof Complex) return false;
return (v == o.v && i == o.i);
}
int hashCode() {
return v.hashCode() + i.hashCode();
}
Complex plus(Complex o) {
if (null == o) throw new IllegalArgumentException();
return new Complex(v + o.v, i + o.i);
}
String toString() {
return "${v} + ${i}i";
}
}
def c = new Complex(1, 0);
def d = new Complex(1, 0);
println c == d; // call equals
println c + d; // call plus
3.6 GString
groovy.lang.GString是对java String的扩展:常量表示更加方便,提供了更多的方法。
'hello world'
"hello $name"
'''-------
python style string
-------'''
"""
triple double quote
with $Gstring aware
"""
/back slash safe \t, \widows\path/
char c='a'; // declare character explicitly
date = "Current London time is ${new Date().toGMTString()}"
province = 'Sichuan'
city = 'Chengdu'
addr = "I am in city: $city province: $province, you?"
println "${addr.strings[0]}, ${addr.strings[1]}, ${addr.values[0]}, ${addr.values[1]}"
// output: I am in city: , province: , Chengdu, Sichuan
println addr[2..3] // output: am
sb = 'i am a string'
sb <<= ' changed to a stringbuffer'
sb << ' now can append' // sb is: i am a string changed to a stringbuffer now can append