【发布时间】:2011-01-20 00:51:58
【问题描述】:
这是我目前所拥有的:
static def traceMethods(Class clazz) {
def mc = clazz.metaClass
mc.static.invokeMethod = { String name, args ->
List types = args.collect { it == null ? null : it.getClass() }
MetaMethod metmeth = mc.getStaticMetaMethod(name, *types) //throws exception sometimes when it shouldnt
println "Starting method $name"
def result = metmeth.doMethodInvoke(delegate, args)
println "Finished method $name"
return result
}
}
这在大多数情况下都能完美运行。但是,有时对getStaticMetaMethod 的调用会在不应该抛出异常时抛出异常。
编辑:它抛出的异常是:
groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method org.codehaus.groovy.runtime.HandleMetaClass#getStaticMetaMethod.|Cannot resolve which method to invoke for [class java.lang.String, null] due to overlapping prototypes between:|?[class java.lang.String, class [Ljava.lang.Object;]|?[class java.lang.String, class [Ljava.lang.Class;]
at groovy.lang.MetaClassImpl.chooseMostSpecificParams(MetaClassImpl.java:2906)
at groovy.lang.MetaClassImpl.chooseMethodInternal(MetaClassImpl.java:2859)
at groovy.lang.MetaClassImpl.chooseMethod(MetaClassImpl.java:2800)
at groovy.lang.MetaClassImpl.getMethodWithCachingInternal(MetaClassImpl.java:1181)
at groovy.lang.MetaClassImpl.createPogoCallSite(MetaClassImpl.java:3022)
【问题讨论】:
-
@lgs - 我编辑了我的问题以包含异常