具有参数的方法的Groovy便捷打印签名

XZe*_*Zen 2 groovy

我有一些Groovy类,例如:

class Apple {
   public void methodA(String myParam) {}
   public void methodB(String myParam2, String myParam3) {}
}
Run Code Online (Sandbox Code Playgroud)

我想以方便的格式打印Apple类的所有方法,例如:

Class Apple: 
- methodA <String: myParam>
- methodB <String: myParam2> <String: myParam3>
Run Code Online (Sandbox Code Playgroud)

要不就:

Class Apple: 
- methodA <myParam>
- methodB <myParam2> <myParam3>
Run Code Online (Sandbox Code Playgroud)

Groovy有可能吗?

现在,我正在为Apple.metaClass.methods和print method.name使用for-each循环,例如:

for (MetaMethod metaMethod in Apple.metaClass.methods) {
    println metaMethod.name
}
Run Code Online (Sandbox Code Playgroud)

但是我找不到打印参数名称的方法。此外,是否有可能知道参数的默认值?

您能否提一些建议?

tim*_*tes 6

没有(*)。参数名称不与字节码一起存储(我相信,如果在打开调试的情况下编译该类,则可能是这样,但我没有尝试过)。

(*这可能的一些非反射挖,但它依赖于很多事情,像感觉是在你的设计相当脆点)

使用Java 7及更低版本,您只需获取参数的类型。使用Java 8,向getParameters中添加了一个新的调用java.lang.reflect.Method,因此使用Java 8和Groovy 2.3+可以执行以下操作:

class Apple {
   public void methodA(String myParam) {}
   public void methodB(String myParam2, String myParam3) {}
}

Apple.class.declaredMethods
           .findAll { !it.synthetic }
           .each { println "$it.name $it.parameters.name" }
Run Code Online (Sandbox Code Playgroud)

打印:

methodB : [arg0, arg1]
methodA : [arg0]
Run Code Online (Sandbox Code Playgroud)

但是如您所见,原始参数名称再次丢失。

至于默认值,Groovy处理这些默认值的方法是创建多个方法。如果声明方法:

class Apple {
    public void foo( bar="quux" ) { println bar }
}
Run Code Online (Sandbox Code Playgroud)

然后,这将以字节码生成两个方法:

public void foo() { foo( 'quux' ) }
public void foo( bar ) { println bar }
Run Code Online (Sandbox Code Playgroud)

如果为包含该方法的类运行以上方法检查器foo,您将看到输出为:

foo : [arg0]
foo : []
Run Code Online (Sandbox Code Playgroud)