Groovy 中有没有办法找出被调用方法的名称?
def myMethod() {
println "This method is called method " + methodName
}
这与鸭子类型相结合将允许非常简洁(并且可能难以阅读)的代码。
Groovy 中有没有办法找出被调用方法的名称?
def myMethod() {
println "This method is called method " + methodName
}
这与鸭子类型相结合将允许非常简洁(并且可能难以阅读)的代码。
Groovy 支持通过invokeMethod
GroovyObject 的机制拦截所有方法的能力。
您可以重写invokeMethod
which 将实质上拦截所有方法调用(要拦截对现有方法的调用,该类还必须实现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()
不,与 Java 一样,没有本地方法可以做到这一点。
您可以编写一个 AST 转换,以便您可以注释该方法,这可以在该方法内设置一个局部变量。
或者,您可以使用生成 stackTrace 并找到正确的 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()