3

我有一个存储在变量中的通用字符串String func = "validate";,我想调用该名称的函数,即我需要调用validate()函数。
我的意思是说我会将变量传递给某个函数
public void callFunc(String func){
....
}
,所以上面的函数应该调用适当的函数,并将函数名作为参数传递给callfunc().

4

2 回答 2

15

可以使用反射来做到这一点,例如

Method method = getClass().getMethod(func);
// TODO: Validation
method.invoke(this);

当然,这是假设您要调用 on 上的方法this,并且它是一个实例方法。查看Class.getMethod和相关的方法,连同它Method本身,以获取更多详细信息。您可能想要getDeclaredMethod,并且您可能需要使其可访问。

如果可能的话,我会看看你是否能想出一种避免这种情况的方法——反射往往会很快变得混乱。值得退后一步考虑这是否是最好的设计。如果您向我们提供有关大局的更多详细信息,我们或许可以提出替代方案。

于 2012-05-09T06:19:30.457 回答
0

除了使用反射之外,还有另一种方法。您可以编写如下模式匹配:

switch (func) {
  case "validate": validate(); break;
  case "apply": apply(); break;
  default: break;
}

但我同意乔恩的观点:尽量避免这种情况。如果您使用模式匹配,则必须应用更改两次。例如,如果添加另一个方法,则需要将其添加到函数命名方法和模式匹配中。

于 2012-05-09T06:41:22.693 回答