加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy探索之MOP 六 运行期内添加构造器和静态方法

发布时间:2020-12-14 17:08:34 所属栏目:大数据 来源:网络整理
导读:?? Groovy探索之MOP 六 运行期内添加构造器和静态方法 ? ? ? ? 构造器是我们喜欢重载的一个方法,因为我们在实例化一个类的时候,会遇到各种各样的情况,比如在某些情况下,一系列类的实例可能有一些相同值的属性,这时候,我们在实例化对象时,就不希望把这

?? Groovy探索之MOP 六 运行期内添加构造器和静态方法

?

?

?

?

构造器是我们喜欢重载的一个方法,因为我们在实例化一个类的时候,会遇到各种各样的情况,比如在某些情况下,一系列类的实例可能有一些相同值的属性,这时候,我们在实例化对象时,就不希望把这些相同的值分别注入到每一对象中,这样的工作很繁琐。

这时候,我们就会重载构造器,但一些时候,比如一些Bean对象,它们的属性很多,我们就不好在类中重载很多构造器。比如,我们有如下的一个GroovyBean类:

?

class Reader {

???

??? String province

???

??? String city

???

??? String name

???

??? int age

?

}

?

这是一个很简单的GroovyBean类,我们不会在里面重载构造器了。一般我们都会做如下的实例化:

?

?????? def reader = new Reader(province:'Guangdong',city:'Shenzhen',name:'Tom',age:22)

???

?

现在,我们有这样一个场景:可能有一批的读者,都是来自广东省深圳市,那么我们把每一个读者都做上面的初始化,就显得太繁琐了。

这时候,我们就可以在运行期内给上面的GroovyBean类重载一个构造器了。如下所示:

?

?????? Reader.metaClass.constructor = {String name,int age ->

?????????? new Reader(province:'Guangdong',name:name,age:age)

?????? }

???

?

在这个构造器里,我们把属性"province"和"city"赋给默认值,然后再给构造器注入两个参数即可。测试代码如下:

?

?????? def reader1 = new Reader('Tom',22)

??????

?????? println"""

?????? name:??? ${reader1.name}

?????? age:???? ${reader1.age}

?????? address: ${reader1.province} ${reader1.city}"""

??????

?????? def reader2 = new Reader('Mike',20)

??????

?????? println """

?????? name:??? ${reader2.name}

?????? age:???? ${reader2.age}

?????? address: ${reader2.province} ${reader2.city}"""

???

?

运行结果为:

?

?????? name:??? Tom

?????? age:???? 22

?????? address: Guangdong Shenzhen

?

?????? name:??? Mike

?????? age:???? 20

?????? address: Guangdong Shenzhen

?

?

在运行期内我们也可以给类添加一些静态方法,这里添加静态方法有两种方式,第一种是在运行期内进行拦截。比如我们有如下的一个类:

?

class Foo {

???

???

}

?

现在这个类里一个方法也没有,我们将要在运行期内给它添加一个静态方法,如下:

?

??? ? Foo.metaClass.'static'.invokeMethod = {

?????? ? String name,args1 ->

?????????? def metaMethod = Foo.metaClass.getStaticMetaMethod(name,args1)

?????????? def result

?????????? if(metaMethod) result = metaMethod.invoke(name,args1)

?????????? else result = 'foo'

?????????? result

??? ? }

?

?

那么,我们就可以测试它了:

?

??? ? println Foo.foo()

???

运行结果为:

foo

?

值得注意的是,下面的代码行:

def metaMethod = Foo.metaClass.getStaticMetaMethod(name,args1)

?

是用来获取指定的静态方法,如果存在的话,就直接调用,否则就返回"foo"。

如果给上面的Foo类添加一个如下的静态方法:

?

??? def static bar()

??? {

?????? 'bar'?

??? }

?

再做如下的测试:

?

??? ? println Foo.foo()

???

??? ? println Foo.bar()

?

?

则结果为:

foo

bar

?

?

这种拦截的方法其实就是在运行期内重载静态的"invokeMethod"方法。除此之外,我们还可以直接添加静态方法。

还是上面的Foo类,我们可以使用如下的方法来添加静态方法:

?

?

??? ? Foo.metaClass.'static'.hello = {

?????? args1 ->

?????????? return "hello,${args1}"

??? }

?

?

这种添加方法就显得十分的简单,如果去掉那个"static",就变成了添加一个普通的方法。

现在来做点测试:

?

??? ? println Foo.hello('world')

?

?

运行结果为:

hello,world

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读