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!]
新闻热点
疑难解答