Groovy/Gradle: groovy中的元编程

groovy中的元编程:

编写的代码所执行的时期。(RunTime)

比如有解释执行的Js,编译执行的java,还有运行时期执行的代码java反射

groovy运行期的能力:


从下往上分析。

 

这下在编译、运行的时候都没出错并输出了参数。即表明了调用了一个类的方法的时候如果它不存在,但是又重写了invokeMethod()方法,那么代码不会报错,只会根据我们的实现去调用invokeMehtod()方法的实现.在java中编译都过不了,更别说运行了。

所以,一个方法找不到的时候,调用invokeMethod()方法来代替。

这是流程图中最下面的那个判断。

同样的继续网上递归判断,

 看到会优先调用methodMissing(),如果没有methodMissing()就会往下走调用invokeMethod(),如果invokeMethod()也没有的话就回到了我们最开始看到的运行时报错。

再看metaClass,就会看到groovy的强大。[在运行时强大的作用:为类在运行的时期动态的添加属性或者方法]

同样的可以对该动态注入的属性进行像平常一样的修改。

同理,注入一个方法也是如此:

添加一个静态的方法:


思考:这种运行时的意义?和直接在类中提供有何差别?

答:引入第三方库,其中的某个类有我们想用的方法,但是这个方法又不够全,想给里面添加点自己的方法。通常是extends它进而扩展,但是如果是final 类,任何类不能继承它,只能用它已有的方法。这个时候groovy的动态添加就有了大展身手的地方。不修改、不继承,通过metaclass变相的对原有的类进行了扩展。


以上其实在整个应用中不是一次性注入到处使用的。所以,这里顺便介绍如何一次注入全局使用(ExpandMetaClass.enableGlobally())

 

这就是一次注入多次使用了。有点像SpringBoot的那个@AutoWire的意思。