首页 > 学院 > 开发设计 > 正文

Groovy方法合成

2019-11-08 01:48:10
字体:
来源:转载
供稿:网友

Groovy方法合成

方法合成在调用时动态地确定方法的行为。1、在GroovyObject中合成方法,使用methodMissing方法来拦截未定义方法并进行处理。
class AGroovyClass {	def methodMissing(String name, args) {		PRintln "In methodMissing " + name		if (name == "add") {			println "In add function"		}    }}obj = new AGroovyClass()obj.add()obj.del()obj.add()返回In methodMissing addIn add functionIn methodMissing delIn methodMissing addIn add function2、把动态办法添加到metaClass中,这样不必每次都进入methodMissing方法中。缓存add方法,第二次调用时直接使用metaClass中add方法,提高了效率。
class AGroovyClass {	def methodMissing(String name, args) {		println "In methodMissing " + name		if (name == "add") {			println "In add function"			def func = {Object[] vargs ->				println "in add func " + vargs			}			AGroovyClass instance = this			instance.metaClass."$name" = func			func(args)		}	}}3、在GroovyInterceptable中合成方法,使用invokeMethod方法来拦截未定义方法并进行处理。每次都先查询metaClass中是否存在该方法,存在的话直接调用,不存在的再定义。所有的信息都调用System.out.println方法。
class AInterceptable implements GroovyInterceptable {	def invokeMethod(String name, args) {		System.out.println("In invokeMethod " + name) 		def method = metaClass.getMetaMethod(name, args)		if (method) { // 直接进行方法调用			method.invoke(this, args)		} else { // 调用metaClass的invokeMethod方法,会在methodMissing中重新定义。			metaClass.invokeMethod(this, name, args)		}	}	def methodMissing(String name, args) {		System.out.println("In methodMissing " + name)		if (name == "add") {			System.out.println("In add function");			def func = {Object[] vargs ->				System.out.println("in add func " + vargs)			}			AInterceptable instance = this			instance.metaClass."$name" = func			func(args)		}	}}obj = new AInterceptable()obj.add(11)obj.add(11, 12)obj.add("Hello ", "World!")返回In invokeMethod addIn methodMissing addIn add functionin add func [11]In invokeMethod addin add func [11, 12]In invokeMethod addin add func [Hello , World!]4、MetaClass合成
class AGroovyClass {}AGroovyClass.metaClass.methodMissing = {String name, args ->	println "In methodMissing " + name	if (name == "add") {		println "In add function"		def func = {Object[] vargs ->			println "in add func " + vargs		}		AGroovyClass.metaClass."$name" = func		func(args)	}}obj = new AGroovyClass()obj.add(11)obj.add(11, 12)obj.add("Hello ", "World!")返回In methodMissing addIn add functionin add func [11]in add func [11, 12]in add func [Hello , World!]
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表