Groovy10_元编程(方法合成与委托)

Posted 李樟清

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy10_元编程(方法合成与委托)相关的知识,希望对你有一定的参考价值。

1. 创建动态类

// 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'))
            // 生成的class文件 调用方式不一样
            // println metaClass // groovy.lang.MetaClassImpl@37e547da[class Person]
            // metaClass.fun=  // 如果用这个metaClass 注入方法是会报错的,只能用外面的HandleMetaClass 来进行注入
            Person p = this
            // println p.metaClass // org.codehaus.groovy.runtime.HandleMetaClass@37e547da[groovy.lang.MetaClassImpl@37e547da[class Person]]
            p.metaClass."$name"=
                println "invoke $name"
            
            "$name"(args)
        
        return null
    


def p = new Person()
println p.metaClass  // org.codehaus.groovy.runtime.HandleMetaClass@37e547da[groovy.lang.MetaClassImpl@37e547da[class Person]]


p.playGame()  // missing
              // invoke playGame
p.playGame()  // invoke playGame

3. 方法委托

// 1.方法委托

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()  // excute1
// 这是正常的调用过程,多了一个节点,我们可以通过methodMissing
// 来进行方法委托,达到 wm.excute1()

wm.excute1()    // excute1

// 2. 如果对象一多呢

class WorkManager1

    
        delegate(Work1,Work2)
    

    def delegate(Class... classes)
        // 创建对应的对象
        def objects = classes.collectit.newInstance()
        WorkManager1 wm = this
        // 注入methodMissing方法
        wm.metaClass.methodMissing = 
            String name,def args ->
                // 查找调用的方法的实现对象
                def object = objects.findit.respondsTo(name,args)
                if (object)
                    // 动态注入方法
                    wm.metaClass."$name"=
                        object.invokeMethod(name,it)
                    
                    invokeMethod(name,args)
                
        
    



def wm1 = new WorkManager1()
wm1.excute1() // excute1

// 使用注解来进行委托
class WorkManager2
    @Delegate Work1 work11 = new Work1()


new WorkManager2().excute1()  // excute1

以上是关于Groovy10_元编程(方法合成与委托)的主要内容,如果未能解决你的问题,请参考以下文章

GroovyMOP 元对象协议与元编程 ( 方法合成引入 | 类内部获取 HandleMetaClass )

GroovyMOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )

GroovyMOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

GroovyMOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )

Groovy:为接口委托元类?

Groovy编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )