Groovy 分类注入

来源:互联网 发布:c语言韩信点兵怎么理解 编辑:程序博客网 时间:2024/06/08 17:11

Groovy 分类注入

首先申明下,本文为笔者学习《Groovy 程序设计》的笔记,并加入笔者自己的理解和归纳总结。

1、use方法注入

Groovy使用use来注入方法,但该方法必须是静态的,并且第一个参数必须是目标对象。
class AGroovyClass {def add(val1, val2) {val1 + val2}}class AGroovyClassExtend {def static add(self, val1, val2, val3) {self.add(self.add(val1, val2), val3)}}use(AGroovyClassExtend) {obj = new AGroovyClass()println obj.add("Hello ", "World!")println obj.add("Hello ", "World!", " Welcome to Groovy!")}
返回
Hello World!
Hello World! Welcome to Groovy!

2、Category注解

(1) Category注解将静态方法转变为实例方法。
class AGroovyClass {def add(val1, val2) {val1 + val2}}@Category(AGroovyClass)class AGroovyClassExtend {def add(val1, val2, val3) {add(add(val1, val2), val3)}}use(AGroovyClassExtend) {obj = new AGroovyClass()println obj.add("Hello ", "World!")println obj.add("Hello ", "World!", " Welcome to Groovy!")}
返回
Hello World!
Hello World! Welcome to Groovy!

(2) 注入的方法可以使用类或闭包作为参数

class AGroovyClass {}@Category(AGroovyClass)class AGroovyClassFilter {def filter(array, closure) {array.collect { closure(it) }}}use(AGroovyClassFilter) {obj = new AGroovyClass()println obj.filter([1, 2, 3, 4, 5, 6]) { it * it }}
返回
[1, 4, 9, 16, 25, 36]

3、use方法支持多个分类注入。

class AGroovyClass {    def add(val1, val2) {        val1 + val2    }}@Category(AGroovyClass)class AGroovyClassExtend {    def add(val1, val2, val3) {        add(add(val1, val2), val3)    }}@Category(AGroovyClass)class AGroovyClassFilter {    def filter(array, closure) {        array.collect { closure(it) }    }}use(AGroovyClassExtend, AGroovyClassFilter) {obj = new AGroovyClass()println obj.add("Hello ", "World!")println obj.add("Hello ", "World!", " Welcome to Groovy!")println obj.filter([1, 2, 3, 4, 5, 6]) { it * it }}

4、注入的方法拦截原有方法

class AGroovyClass {    def add(val1, val2) {        val1 + val2    }    def add(val1, val2, val3) {        val1 + val2 + val3    }}class AGroovyClassExtend {    def static add(self, val1, val2) {        "AGroovyClassExtend add"    }// 只有指定了self的类型,才会拦截    def static add(AGroovyClass self, val1, val2, val3) {        "AGroovyClassExtend add"    }}use(AGroovyClassExtend) {    obj = new AGroovyClass()    println obj.add("Hello ", "World!") // Hello World!    println obj.add("Hello ", "World!", " Welcome to Groovy!") // AGroovyClassExtend add}

0 0
原创粉丝点击