Groovy语法学习(八)MOP探索之动态类与方法注入

groovy作为一门动态语言,使用非常灵活。MOP中提供了动态类与运行时的方法注入,整理了一下使用方法。

一、动态类


def expando =new Expando(name:"hello",fun1:{println "fun1"})

println expando.name

//这里这样使用依然会报错,相信也是只生成了方法
//println expando.@name
expando.fun1()
expando.age=14
println expando.age


expando.fun2={
    println "fun2"
}

expando.fun2()

结果:

hello
fun1
14
fun2

二、方法注入

方法注入在groovy中有三种形式。

  • 1、metaclass
  • 2、category
  • 3、 mixin

分别看一下使用方法

(一) metaClass

对于metaClass其实上一篇文章有过简单的使用。其实使用非常简单。
添加静态方法与普通方法

String.metaClass.printSelf={
    //delegate是实例
    println delegate
}
"123".printSelf()

String.metaClass.'static'.testHello={
    println 'hello'
}

String.testHello()

class ABC{
    int i=5

}

String.metaClass.constructor={
    ABC it->
        new String("$it.i")
}

println new String(new ABC())

结果:

123
hello
5

多个方法一并注入



String.metaClass{
    printSelf = {
        //delegate是实例
        println delegate
    }
    'static' {
        testHello = {
            println 'hello'
        }
    }
    constructor = {
        ABC a ->
            new String("$a.i")
    }
}
String.testHello()

结果就不多做演示了,基本和上面的类似。
关于metaClass其实还有其他细节,这篇文章的metaClass总结的十分详细,可以直接看一看。
https://blog.csdn.net/qjbagu/article/details/49735255

(二) 使用分类进行注入

这种方式需要使用use进行,直接写类名和类名.class是一样的。

class ExMethod{
    static def log(String self) {
        println self
    }
}

use(ExMethod){

    "123".log()
}

@Category(String)
class ExMethod1{
     def log() {
        println this
    }
}
use(ExMethod1){
    "256".log()
}

结果:

123
256
(三)使用mixin进行注入
class Get{

    def get(String url){
        url.toURL().text;
    }

}


String.mixin(Get)

println "".get("http://www.baidu.com")

结果:

<!DOCTYPE html>.....

使用mixin注解

class Helper {
    def work() {
        println "$name is working"
    }
}
@Mixin(Helper)
class AGroovyClass {
    def getName() { "AGroovyClass" }
}
new AGroovyClass().work() // AGroovyClass is working

结果:

AGroovyClass is working

方法注入基本上已经写完了,接下来是方法合成以及委托。

猜你喜欢

转载自blog.csdn.net/a568478312/article/details/79928882