昨天我开始使用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中解决这个问题?或者我应该只使用地图/数组或类似的东西?
谢谢你回答!
答案 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