Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass

Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass,第1张

概述          Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass       Class当然是Groovy语言从Java语言继承来的,这就是说Groovy语言也继承了Java语言的反射机制。这意味着我们能够像在Java语言里使用反射那样,在Groovy语言里写出诸如下面的代码: import java.lang.reflect.Method   c

          Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass

 

 

 

Class当然是Groovy语言从Java语言继承来的,这就是说Groovy语言也继承了Java语言的反射机制。这意味着我们能够像在Java语言里使用反射那样,在Groovy语言里写出诸如下面的代码:

import java.lang.reflect.Method

 

class Testor {

   

    def testDelegate()

    {

       'ok'

    }

 

  static voID main(args) {

     

      def t = new Testor()

     

      Class cls = t.class

     

      Method method = cls.getmethod('testDelegate',null)

     

      println method.invoke(t,null)

  }

 

}

 

 

当然,我们在Groovy语言里很少会这样用了,因为Groovy语言的MOP机制比起Java语言的反射机制来说,强大的很多倍。

总结来说,Groovy语言的MOP机制主要由以下几种方法来实现:

第一, 就是Groovy Class本身的hook,包括重载"invokeMethod"和"set/getProperty"方法,和重载"methodMissing"和"propertyMissing"方法。这些方法都已经在不同的文字中反复被提及,在这里就不再重述。 第二, 就是通过MetaClass来实现的MOP机制。

在Groovy语言中,所有的类都起源于GroovyObject接口,该接口中有如下的两个方法:

 

public MetaClass getMetaClass();

public voID      setMetaClass(MetaClass MetaClass);

 

我们的所有对象的MetaClass对象,都是通过这两个方法而来的。

在MetaClass对象中,我们可以实现如下的一些方法:

Object invokeMethod(Object obj,String methodname,Object args)

Object invokeMethod(Object obj,Object[] args)

Object invokeStaticmethod(Object obj,Object[] args)

Object invokeConstructor(Object[] args)

 

分别用来调用方法、静态方法和属性。同时,我们还有一些用来自省的属性和方法,如:"propertIEs"、"respondsTo"和"hasProperty"等等。

 

所以,我们要想使用MetaClass来实现MOP机制,就需要实现一个我们自己的MetaClass,然后把它通过"setMetaClass"方法set到GroovyObject对象中,从而达到使用MetaClass的目的。

很显然,要通过这种方法来实现Groovy语言的MOP机制不是很灵活,远不如上面的hook好用。

 

第三, 就是通过ExpandoMetaClass来实现的MOP机制

据说,ExpandoMetaClass类的使用,起源于Grails项目,由于它实现MOP机制的极大方便性,从Groovy1.1开始,就被引入到了Groovy语言的核心API。

与上面的MetaClass类不同的是,MetaClass类是通过Groovy的对象的"setMetaClass"和"getMetaClass"引入;而ExpandoMetaClass类是由"java.lang.class"类的"MetaClass"引入。

如下面的例子:

class Testor5 {

   

    private delegate

   

    def testDelegate()

    {

       'ok'

    }

 

  static voID main(args) {

     

      def t = new Testor5()

     

     

      t.testDelegate()

     

      Testor5.MetaClass.test = {

         ->

           'invoke test function'

      }

     

      def t1 = new Testor5()

     

      println t1.test()

 

  }

 

}

 

当然,ExpandoMetaClass类也可以对单独的对象进行添加方法和属性,体现了极大的灵活性和动态性。

所有这些,都将会在以后的篇幅中详细描述,在这里就不再细说。

总结

以上是内存溢出为你收集整理的Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass全部内容,希望文章能够帮你解决Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1266918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存