Javer学习Groovy
这里只记录一些groovy和java语法差异比较大的地方
-
方法调用不需要括号
-
访问控制默认是public而不是java中的default,并且属性名大写
- 范围运算(支持倒序和字母):[‘G’..‘B’]相当于['G','F','E','D','C','B']
- =~运算用于匹配左侧字符串是否满足右侧表达式:‘Groovy'=~'^G'
- trait的出现允许了多继承(trait既提供了方法的实现,还可以有成员变量)
- 存在隐式类型转换为boolean
- 可以通过[:]来定义映射
闭包。closure看上去是一块代码,像是匿名方法(允许参数,并且可以访问外部参数)。可以通过call来调用,其执行时以执行处变量的值为准(而不是定义时)
class Example {
static void main(String[] args) {
def str1 = "Hello";
def clos = {param -> println "${str1} ${param}"}
clos.call("World");
// We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
}
}
在集合和映射中使用闭包,参数为it
class Example {
static void main(String[] args) {
def lst = [11, 12, 13, 14];
lst.each {println it}
def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]
mp.each {println it}
mp.each {println "${it.key} maps to: ${it.value}"}
}
}
通过实现GroovyInterceptable来处理缺失的属性和方法
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
mst.AddMarks();
}
}
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def invokeMethod(String name, Object args) {
return "called invokeMethod $name $args"
}
}
使用metaClass来实现反射
class Example {
static void main(String[] args) {
Student mst = new Student();
println mst.getName()
mst.metaClass.setAttribute(mst, 'name', 'Mark')
println mst.getName()
}
}
另外可以通过methodMissing来处理缺失的方法
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def methodMissing(String name, def args) {
println "Missing method"
}
}