groovy的metadataClass的使用
groovy虽然是在java的基础上发展起来的,但是在MOP这一块groovy的确很强大,这次分享的是groovy的MOP中动态方法这一块,这个区别于invokemethod和methodmissing. 1.使用metaClass添加构造方法 这个貌似不常用,就随便说下好了 //在运行期为类添加构造方法 AddMethod.metaClass.constructor ={String name,String age-> new AddMethod(address:'海南省琼海市',name:name,age:age) } 2.运行期添加静态方法和普通方法 //在运行期为类添加方法 AddMethod.metaClass.myMethod={ return "Hello" } //添加静态方法 AddMethod.metaClass.'static'.hello = {args1 -> return "你好,${args1}" } 3.调用运行期添加的方法 def m=new AddMethod() println m.myMethod() def m2=new AddMethod('潘玮柏','29') println "${m2.address},${m2.name},${m2.age}" println AddMethod.hello("李明") 运行效果如下: 4.动态方法的其他实现 除了上面的metaClass外实现运行期添加方法还可以用ExpandoMetaClass来实现,就像下面这样 package org.lxh class AddMethod2 { def query(){ println "事先存在的方法" } static void main(args) { /*运行期内为类添加方法 def mc = new ExpandoMetaClass(AddMethod2.class,true) mc.other = {-> println '运行期内添加的方法' } mc.initialize() def m=new AddMethod2() m.other()*/ def m2 = new AddMethod2() def emc = new ExpandoMetaClass(AddMethod2.class,false ) emc.other = { println "other" } emc.initialize() m2.metaClass = emc m2.other() //def m3 = new AddMethod2() //此时调用other会报错--因为这个方法只在m2中存在 //m3.other() if(m2.metaClass.respondsTo(m2,"other")){ println "respondsTo找到了运行期内添加的方法" } if(AddMethod2.metaClass.getMetaMethod("other")){ println "getMetaMethod找到了运行期为属性添加的方法" } } } 运行效果如下: 这里要注意的就是如果把这个ExpandoMetaClass对象作为metaClass给一个new出来的对象,那么其他new出来的对象是找不到运行期添加的方法的 上面的代码出现了respondsTo和getMetaMethod,下面是两者的区别: "respondsTo"方法可以找到一个类固有的方法,使用MOP特性在运行期内给类添加的方法,和使用MOP特性在运行期内给对象添加的方法。而"hasMetaMethod"方法则只能找到一个类固有的方法,和使用MOP特性在运行期内给类添加的方法,而不能找到使用MOP特性在运行期内给对象添加的方法。 把ExpandoMetaClass对象作为metaClass给一个new出来的对象,这种情况就属于运行期给对象添加方法这一种。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |