一、使用Object类的扩展
1、使用dump和inspect方法
如果想知道类的实例包含了哪些内容,在可以在运行时使用dump()方法。例子:
def str="hello"
println str
println str.dump()
结果:
hello
<java.lang.String@5e918d2 value=hello hash=99162322>
2、使用上下文with()方法
with()接收一个闭包作为参数,在闭包内调用任何方法都会自动解析到上下文对象。例子:
def lst= [1,2,3]
lst<<4
lst<<5
println lst.size()
println lst.contains("o")
结果:
5
true
使用with方法后:
lst.with{
add(6)
add(7)
println size()
println contains("o")
}
结果:
7
true
3、使用sleep
添加到Object类上的sleep方法在给定的时间内会忽略中断。
4、间接访问属性
Car car=new Car(2017)
def properties=car.properties as String[]
for(String prop in properties) {
println prop
}
结果:
year=2017
miles=0
5、间接访问方法
使用obj.invokeMethod(params)间接使用方法
class People{
def walk(){
println "walk method called without param"
}
def walk(intlength){
println "walk method called with one param"
}
def walk(intlength,intwidth){
println "walk method called with two param"
}
}
代码调用:
People p=new People()
p.invokeMethod("walk",null)
p.invokeMethod("walk",1000)
p.invokeMethod("walk",[1000,2000])
结果:
walk method called without param
walk method called with one param
walk method called with two param
二、其他扩展
1、数组扩展
在数组中可以使用Range作为索引,访问数组中一个或者多个元素。例子:
代码调用:
int[] arrayOfInts= [1,2,3,4,5,6,7,8]
def integers=arrayOfInts[2..5]
println integers
结果:
[3, 4, 5, 6]
2、java.lang的扩展
lang包中基本数据包装类中,Number类的子类(Integer和Double)加上了迭代器方法:upto、downto以及step.
通过调用String类的execute方法可以获取一个进程实例。
def process="notepad".execute()
println process.text
结果:
使用Thread.start方法再为之传递一个闭包,即可启动一个新的线程。如果想要该线程是守护线程,那么使用startDaemon来替代start方法,同样为之传递一个闭包即可。
3、java.io的扩展
groovy中,使用一个File的实例属性text即可获取文件内容;使用File的实例属性eachLine即可逐行读出文件内容;使用filterLine即可获取满足条件行的内容;如果想使用完毕后自动刷新并关闭一个流,可以使用withStream方法该方法会调用作为参数的闭包。
4、使用java.util的扩展
groovy为java.util中的类添加了一些扩展,List、Set、SortedMap、SortedSet都添加了asImmutable方法将实例变成不可变的,还添加了asSynchronized方法创建一个线程安全的实例。
为Iterator添加Inject方法。
为Timer添加了runAfter方法,传递一个闭包,该闭包在给定时间延迟后运行。
三、使用扩展模块定制方法
(略去)
《完》