Groovy:动态方法调用及其参数

时间:2014-03-26 13:19:40

标签: java dynamic groovy

昨天我开始使用Groovy,我找到了 Dynamic Method Invocation 函数。这是一个很好的函数,可以根据方法名称动态调用方法。这对我来说很好。现在我们想根据不同参数的名称调用这些方法。例如,我有2个方法:

 def changeResponseWithParametersAandB(def response, String a, String b) { 
        response.result = args[0];
        return response;
 }

 def changeResponseWithParameterA(def response, String a) { 
        response.result = args[0];
        return response;
 }

我将使用方法名称循环一个列表,例如:

for (int i = 0; i < methods.size(); i++) {
    DynamicMethods dynamicMethod = methods.get(i);
    methodName = dynamicMethod.getMethodName();

    changeFieldValues."$methodName"(response, <HOW_SHOULD_I_DO_THIS_PART>);
}

唯一的问题是这不适用于这两种方法中的一种。我应该使用第一种方法2参数和第二种方法3参数。有没有办法在groovy中解决这个问题?或者我应该只使用地图/数组或类似的东西?

谢谢你回答!

2 个答案:

答案 0 :(得分:4)

下面的东西就够了吗?而不是有两个方法,你可以有一个方法,第二个参数是可选的。我试图通过地图和列表来模仿实现。如果您需要更多说明,请大声说出来。

def changeResponseWithParametersAandB(def response, String a, String b = null) { 
    response.result = [first: a, second: b]
    return response
}

def methods = [ 'changeResponseWithParametersAandB' ]
def response = [:]
def args = [ [ 'string1' ], [ 'string1', 'string2' ] ]

args.each { arg ->
    methods.each { method ->
        def result = "$method"( response, *arg )
        assert arg.size() == 1 ? 
            result == [ result : [ first:'string1', second:null ] ] : 
            result == [ result : [ first:'string1', second:'string2' ] ]
    } 
}

return "Done testing"

答案 1 :(得分:2)

您可以将参数打包到列表中,然后使用as Object[]传递它们。我发现invokeMethod略显清洁,但这是一个品味问题:

def foo(number, string) { number + string }
def bar(number) { number * 2 }

def calls = [foo: [90, 'string'], bar: [150]].collect { method, params ->
  this.invokeMethod(method, params as Object[])
}

assert calls[0] == '90string'
assert calls[1] == 300