美文网首页
元编程(动态类、方法合成与委托)

元编程(动态类、方法合成与委托)

作者: lv_mock | 来源:发表于2020-06-19 16:37 被阅读0次

动态类

def expando = new Expando(name:'zhangshan',fun1:{'fun1'})
expando.size = 100
expando.fun2 = {
    "fun2"
}

println expando.name
println expando.size
println expando.fun1()
println expando.fun2()
//output:
zhangshan
100
fun1
fun2

方法合成

class Person {
    def methodMissing(String name,def args) {
         "missing"
    }
}
def person = new Person()
println person.dpop()
//output
missing
class Person {
    def methodMissing(String name, def args) {
        println 'missing'

        if (name.startsWith("play")) {
            println metaClass //MetaClassImpl
            Person p = this
            println p.metaClass //HandleMetaClass 要在HandleMetaClasss上注入方法
            p.metaClass."$name" = {
                println "invoke $name"
            }
            "$name"(args)
        }

    }
}

def person = new Person()
println person.metaClass //HandleMetaClass
person.playGame()
person.playGame()
//output:
org.codehaus.groovy.runtime.HandleMetaClass@7188af83[groovy.lang.MetaClassImpl@7188af83[class Person]]
missing
groovy.lang.MetaClassImpl@7188af83[class Person]
org.codehaus.groovy.runtime.HandleMetaClass@7188af83[groovy.lang.MetaClassImpl@7188af83[class Person]]
invoke playGame
invoke playGame

方法委托

class Work1 {
    def fun1 () {
        println "fun1"
    }

    def methodMissing(String name,def args) {
        println 'fun1 missing'
    }
}

class Work2 {
    def fun2 () {
        println "fun2"
    }

    def methodMissing(String name,def args) {
        println 'fun2 missing'
    }
}


class WorkManager {
    Work1 work1 = new Work1()
    Work2 work2 = new Work2()

    def methodMissing(String name,def args) {
        WorkManager wm = this
        if(work1.respondsTo(name,args)) {
            work1.invokeMethod(name,args)
        }else  if(work2.respondsTo(name,args)) {
            work2."$name"(args)
        } else {
            println 'missing'
        }
    }
}

def wm = new WorkManager()


wm.fun1()
wm.fun2()
wm.fun3()
//output:
fun1
fun2 missing
missing
class Work1 {
    def fun1 () {
        println "fun1"
    }

    def methodMissing(String name,def args) {
        println 'fun1 missing'
    }
}

class Work2 {
    def fun2 () {
        println "fun2"
    }

    def methodMissing(String name,def args) {
        println 'fun2 missing'
    }
}


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,args)
            }
            "$name"(args)
        }else  if(work2.respondsTo(name,args)) {
            wm.metaClass."$name" = {
                work2.invokeMethod(name,it)
            }
            "$name"(args)
        } else {
            println 'missing'
        }
    }
}

def wm = new WorkManager()


wm.fun1()
wm.fun2()
wm.fun3()
//output
fun1
fun2
missing
class Work1 {
    def fun1() {
        println "fun1"
    }

    def methodMissing(String name, def args) {
        println 'fun1 missing'
    }
}

class Work2 {
    def fun2() {
        println "fun2"
    }

    def methodMissing(String name, def args) {
        println 'fun2 missing'
    }
}


class WorkManager {
    {
        delegete(Work1,Work2)
    }

    def delegete(Class... classes) {
        def objects = classes.collect { it.newInstance() };
        WorkManager 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)
                    }
                    "$name"(args)
                }
        }

    }
}

def wm = new WorkManager()
wm.fun1()
wm.fun2()
//output
fun1
fun2
class Work1 {
    def fun1() {
        println "fun1"
    }

    def methodMissing(String name, def args) {
        println 'fun1 missing'
    }
}


class WorkManager {
    @Delegate Work1 work1  = new Work1()
}
new WorkManager().fun1()
//output
fun1

相关文章

  • 元编程(动态类、方法合成与委托)

    动态类 方法合成 方法委托

  • Runtime相关

    Runtime 数据结构 类对象与元类对象 消息传递 方法缓存 消息转发 Method-Swizzling 动态添...

  • Python类元编程

    1. 什么是类元编程 类元编程是指动态地创建或定制类,也就是在运行时根据不同的条件生成符合要求的类,一般来说,类元...

  • Java代理模式

    代理的实现分为: 1.静态代理实现 2.动态代理 委托类和委托对象:委托类是一个类,委托对象是委托类的实例。代理类...

  • Category实现原理

    依赖runtime 动态的将分类的方法和类方法合并到类对象和元类对象的方法列表中 (对实例对象 类对象 元类对...

  • Java动态代理

    Java动态代理介绍 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托...

  • Python学习(五)

    类与对象 面向对象高级编程 使用slots 给一个类动态的绑定属性和方法 from types import M...

  • #Runtime

    包括以下内容 数据结构 类对象与元类对象 消息传递 方法缓存 消息转发 Method-Swizzling 动态添加...

  • Python:面向对象编程(进阶)

    类动态绑定方法与限定实例属性 类动态绑定方法 前面我们说了如何给类动态的添加属性,那么如何动态绑定方法呢?如下示例...

  • 10月30日C#学习总结

    今天学习了委托和事件。 委托:委托是一个类,它定义了方法的类型,与其他的类不同,委托类具有一个签名,并且它只能对与...

网友评论

      本文标题:元编程(动态类、方法合成与委托)

      本文链接:https://www.haomeiwen.com/subject/bcovxktx.html