有没有在Groovy的方式,找出所调用的方法的名字吗?
def myMethod() {
println "This method is called method " + methodName
}
这与鸭打字组合将允许相当简洁(也可能难以阅读)的代码。
有没有在Groovy的方式,找出所调用的方法的名字吗?
def myMethod() {
println "This method is called method " + methodName
}
这与鸭打字组合将允许相当简洁(也可能难以阅读)的代码。
不,与Java有这样做的没有原生的方式。
你可以写一个AST转换,让你可以注释方法,这可能设置方法中的局部变量。
或者你也可以做到这一点产生一个堆栈跟踪,并与像找到正确的StackTraceElement的好老的Java方法:
import static org.codehaus.groovy.runtime.StackTraceUtils.sanitize
def myMethod() {
def name = sanitize( new Exception().fillInStackTrace() ).stackTrace.find {
!( it.className ==~ /^java_.*|^org.codehaus.*/ )
}?.methodName
println "In method $name"
}
myMethod()
Groovy支持通过拦截所有方法的能力invokeMethod
的GroovyObject的机制。
您可以覆盖invokeMethod
,将主要拦截所有的方法调用(拦截现有方法的调用,类还必须实现GroovyInterceptable
接口)。
class MyClass implements GroovyInterceptable {
def invokeMethod(String name, args) {
System.out.println("This method is called method $name")
def metaMethod = metaClass.getMetaMethod(name, args)
metaMethod.invoke(this, args)
}
def myMethod() {
"Hi!"
}
}
def instance = new MyClass()
instance.myMethod()
此外,您还可以添加此功能到现有的类:
Integer.metaClass.invokeMethod = { String name, args ->
println("This method is called method $name")
def metaMethod = delegate.metaClass.getMetaMethod(name, args)
metaMethod.invoke(delegate, args)
}
1.toString()