在Groovy中动态获取闭包的参数列表

时间:2017-11-13 13:55:39

标签: groovy metaprogramming groovyshell

我在一个使用shell.evaluate()方法加载的groovy文件中定义了Closure。 我需要通过使用shell."$closurename".call(arguments)调用调用程序来调用此闭包。 但是为了形成闭包参数(上面的参数),我现在需要封闭$ Closurename接受的参数和参数名称是什么。有没有办法在Groovy中动态地了解这一点?我检查了metaClass.method属性,但这在我下面的示例中不起作用。

以下是示例代码。

        def arguments;
        shell.evaluate(new File("/tmp/myGroovyClosureFile.groovy"))
        testBlock = "myClosureName"
        //Code here to find the parameters for myClosureName and create
        //the arguments variable
        shell."$testBlock".call(arguments)

2 个答案:

答案 0 :(得分:0)

  

有没有办法在Groovy中动态地了解这一点?

您无法在运行时动态执行此操作。

答案 1 :(得分:0)

正如Jeff所提到的那样,为闭包生成代码时,以某种方式使参数名称匿名化似乎很繁琐。但是,您仍然可以使用反射来获取尽可能多的信息:

def cl = { int a, String b ->
println(a)
println(b)
}

def callMethod = cl.class.methods.find {
    it.name == "call"
}

println callMethod.parameterTypes
println callMethod.parameters.name

并输出:

[int, class java.lang.String]
[arg0, arg1]