1. 创建动态类
def expand = new Expando(name:'hello',fun1:{"fun1"})
expand.height = 100
expand.fun2 = {
"fun2"
}
println expand.name
println expand.height
println expand.fun1()
println expand.fun2()
2. 元编程 方法合成
class Person {
def methodMissing(String name, def args) {
println "missing"
if (name.startsWith('play')){
Person p = this
p.metaClass."$name"={
println "invoke $name"
}
"$name"(args)
}
return null
}
}
def p = new Person()
println p.metaClass
p.playGame()
p.playGame()
3. 方法委托
class Work1{
def excute1(){
println "excute1"
}
}
class Work2{
def excute2(){
println "excute2"
}
}
class WorkManager{
Work1 work1 = new Work1()
Work2 work2 = new Work2()
def methodMissing(String name, def args) {
WorkManager wm = this
if (work1.respondsTo(name,args)){
wm.metaClass."$name" = {
work1.invokeMethod(name,it)
}
"$name"(args)
}else if (work2.respondsTo(name,args)) {
wm.metaClass."$name" = {
work2.invokeMethod(name,it)
}
"$name"(args)
}
return null
}
}
def wm = new WorkManager()
wm.work1.excute1()
wm.excute1()
class WorkManager1{
{
delegate(Work1,Work2)
}
def delegate(Class... classes){
def objects = classes.collect{it.newInstance()}
WorkManager1 wm = this
wm.metaClass.methodMissing = {
String name,def args ->
def object = objects.find{it.respondsTo(name,args)}
if (object){
wm.metaClass."$name"={
object.invokeMethod(name,it)
}
invokeMethod(name,args)
}
}
}
}
def wm1 = new WorkManager1()
wm1.excute1()
class WorkManager2{
@Delegate Work1 work11 = new Work1()
}
new WorkManager2().excute1()