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

Groovy探索之MOP 二 对类属性的各种操作

发布时间:2020-12-14 16:58:08 所属栏目:大数据 来源:网络整理
导读:???????????????????? Groovy 探索之 MOP 二 对类属性的各种操作 ? ? 我们谈到 MOP ,即“元对象协议”,就是对类或对象的各个元素,如名称、方法、属性等等,在运行期进行实时变化,如修改方法名、属性名,动态增加方法、属性等等的一类编程的统称。 比如前

???????????????????? Groovy探索之MOP 对类属性的各种操作

?

?

我们谈到MOP,即“元对象协议”,就是对类或对象的各个元素,如名称、方法、属性等等,在运行期进行实时变化,如修改方法名、属性名,动态增加方法、属性等等的一类编程的统称。

比如前面我们所谈到过的“invokeMethod”和“methodMissing”两个方法,就可以用来使得我们在运行期动态的给一个类增加方法,值得注意的是,这种增加是类级别的,即一个类所有的对象都可以增加方法。

既然说过了在运行期给一个类动态的增加方法,那么相应的,在运行期给一个类动态的增加属性就是我们接着要考虑的事情。

我们都知道,在Java语言中,对属性的操作是通过属性对应的“get”和“set”方法进行的;而在Groovy语言中,对属性的操作则是通过Gpath进行的,这使得我们对于GroovyBean类的编程来说,不管是编写GroovyBean类,还是访问GroovyBean对象的属性,都比Java语言的JavaBean来的简单得多。

比如我们有如下的一个GroovyBean

?

?

class Employee

{

??? String id

???

??? String name

}

?

?

我们现在将它初始化:

?

?

??? ? def empl1 = new Employee(id:'00001',name:'Tom')

??? ?

?

?

现在我们就可以通过Gpath来访问它的属性了:

?

?

??? ? println empl1.name

???

?

当然,所谓Gpath访问,即通过“.”操作符访问,如“empl1.name”并不是直接访问“empl1”对象的“name”属性,而是通过“Employee”类隐含实现了的“get”和“set”方法来访问的。明白了这个道理,我们就可以自由的给GroovyBean类或者对象添加属性了。请先看下面的例子:

?

?

class Employee

{

??? String id

???

??? String name

???

??? def getAge()

??? {

?????? 'everyone is 24'

??? }

}

?

?

?

可以看到,我们并没有给“Employee”类定义“age”属性,但是我们实现了“getAge”方法,我们就可以通过Gpath来访问“age”属性,请看下面的代码示例:

?

??? ?

??? ? def empl1 = new Employee(id:'00001',name:'Tom')

??? ?

??? ?

??? ? println empl1.name

??? ?

??? ? println empl1.age

???

?

运行结果为:

Tom

everyone is 24

?

当然了,我们谈到了是MOP,就是要能够在运行期改变对象属性的方法,这当然也可以水到渠成了。请看下面的例子。

我们先将上面的“getAge”方法从“Employee”类中注销掉:

?

class Employee

{

??? String id

???

??? String name

???

//? def getAge()

//? {

//???? 'everyone is 24'

//? }

}

?

然后,我们在运行期来增加“age”属性,如下:

?

?????? Employee.metaClass."getAge" = {->

?????????? "everyone is 24"

?????? }

?

?????? def empl2 = new Employee(id:'00002',name:'Mike')

?

?????? println empl2.age

???

?

?

可以看到,我们只要给“Employee”类的“metaClass”对象增加一个“get”方法,就可以为“Employee”类增加一个属性。上面代码的运行结果如下:

?

everyone is 24

?

?

关于“metaClass”对象,在本系列的后面会有更加详细的说明,本节就到此为止。到上面为止,我们已经谈到了给一个类动态的增加属性,想到增加属性,马上有会想到增加方法,在前面的部分,我们已经知道了两个动态增加方法的方法,即“invokeMethod”和“methodMissing”方法。这两个方法的好处是可以批量的增加一个类的方法,而不是像上面动态增加属性那样,一次只能增加一个。

那么,在Groovy语言中,有没有能够批量增加属性的方法呢?我们可以回答,当然有。与增加方法“invokeMethod”对应的增加属性有两个方法,即“getProperty”和“setProperty”。下面我们就来看看它们是如何增加类的属性的。

?

?

class Employee

{

??? String id

???

??? String name

???

??? def getProperty(String property)

??? {

?????? "get value from ${property}"

??? }

???

}

?

?

下面来测试该方法:

?

?

?????? def empl3 = new Employee(id:'00003',name:'Rose')

?

?????? println empl3.name

??????

?????? println empl3.age

???

?

运行结果为:

get value from name

get value from age

?

可以看到,“getProperty”方法分派了所有的“get”方法。上面的例子可能相当的没有实用价值,下面给出一个有一点点实用价值的例子。

比如,我们有一个GroovyBean类,事先我们不能够知道它会有多少个属性,一切在运行期内才有答案。我们就可以做如下的一个GroovyBean类:

?

?

class Score {

???

??? def private map

???

??? def Score()

??? {

?????? this.map = [:]

??? }

???

??? def getProperty(String property)

??? {

?????? def value = map."$property"

??????

?????? value = value?value:''

??????

?????? return value

??? }

???

??? void setProperty(String property,Object value)

??? {

?????? map."$property" = value

??? }

?

?

}

?

?

我们来测试上面的例子:

?

??? ? def score = new Score()

??? ?

??? ? score.id = '01'

??? ?

??? ? score.name = 'Chinese'

??? ?

??? ? score.score = '100'

??? ?

??? ? println "$score.name : $score.score"

???

?

运行结果为:

Chinese : 100

(编辑:李大同)

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

    推荐文章
      热点阅读