Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Groovy探索之MOP 二 对类属性的各种操作大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

                     Groovy探索之@H_367_7@mOP 对类属性的各种操作

 

 

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

比如前面我们所谈到过的“invokeMethod”和“@H_367_7@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

 

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

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

 

class employee

{

    String id

   

    String name

   

//  def getAge()

//  {

//     'everyone is 24'

//  }

}

 

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

 

       employee.MetaClass."getAge" = {->

@H_419_997@           "everyone is 24"

       }

 

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

 

       println empl2.age

   

 

 

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

 

everyone is 24

 

 

关于“MetaClass”对象,在本系列的后面会有更加详细的说明,本节就到此为止。到上面为止,我们已经谈到了给一个类动态的增加属性,想到增加属性,马上有会想到增加方法,在前面的部分,我们已经知道了两个动态增加方法方法,即“invokeMethod”和“@H_158_5@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)

    {

       @H_39_10@map."$property" = value

    }

 

 

}

 

 

我们来测试上面的例子:

 

      def score = new score()

     

      score.id = '01'

     

      score.name = 'Chinese'

     

      score.score = '100'

     

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

   

 

运行结果为:

Chinese : 100

@H_28_1974@
@H_449_1977@

大佬总结

以上是大佬教程为你收集整理的Groovy探索之MOP 二 对类属性的各种操作全部内容,希望文章能够帮你解决Groovy探索之MOP 二 对类属性的各种操作所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。