Groovy动态创建类、方法合成、方法委托

/**
 * 动态生成类
 */
def expando = new Expando(name : 'hello',fun1:{int a,int b -> a*b})
expando.height = 100
expando.fun2 = {
    int a,int b->
        a+b
}
println expando.name
println expando.height
println expando.fun1(2,6)
println expando.fun2(2,6)

/**
 * 方法合成
 */
class MyPerson{
    def methodMissing(String name, def args) {
        println 'missing'
        if (name.startsWith('play')){
            //生成的class文件 调用方式不一样
//            println metaClass
            MyPerson p = this
//            println p.metaClass
            p.metaClass."$name" = {
                println "invoke $name"
            }
            "$name"(args)
        }
        return null
    }
}
def p = new MyPerson()
p.playGame()
p.playGame()

/**
 * 方法委托
 */
class Work1{
    def fun(){
        println('work1')
    }
}

class Work2{
    def fun2(){
        println('work2')
    }
}

class WorkManager{
    {
        delegate(Work1,Work2)
    }

    def delegate(Class... classes){
        def objects = classes.collect{it.newInstance()}
        WorkManager workManager = this
        workManager.metaClass.methodMissing = {
            String name,def args->
                def object = objects.find{it.respondsTo(name,args)}
                if(object){
                    //动态注入方法
                    workManager.metaClass."$name" = {
                        object.invokeMethod(name,args)
                    }
                    invokeMethod(name,args)
                }
        }
    }
}
def wm = new WorkManager()
wm.fun()
wm.fun2()

//第二种方法 groovy自带的注解
class WorkManager1{
    @Delegate
    Work1 work1 = new Work1()
    @Delegate
    Work2 work2 = new Work2()
}
new WorkManager1().fun()
new WorkManager1().fun2()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值