Groovy,方便的参数方法打印签名

时间:2014-04-29 07:22:45

标签: groovy

我有一些Groovy类,例如:

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

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

Class Apple: 
- methodA <String: myParam>
- methodB <String: myParam2> <String: myParam3>

或只是:

Class Apple: 
- methodA <myParam>
- methodB <myParam2> <myParam3>

Groovy有可能吗?

现在我正在使用Apple.metaClass.methods的每个循环和打印method.name,例如:

for (MetaMethod metaMethod in Apple.metaClass.methods) {
    println metaMethod.name
}

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

你能告诉我吗?

1 个答案:

答案 0 :(得分:6)

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

(* 可以使用some non-reflection digging,但它依赖于很多东西,感觉它在你的设计中会非常脆弱)

使用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" }

要打印:

methodB : [arg0, arg1]
methodA : [arg0]

但是正如您所看到的,原始参数名称再次丢失。

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

class Apple {
    public void foo( bar="quux" ) { println bar }
}

然后在字节码中生成两个方法:

public void foo() { foo( 'quux' ) }
public void foo( bar ) { println bar }

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

foo : [arg0]
foo : []