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);

もちろん、でメソッドを呼び出したいと仮定しthis、それがインスタンスメソッドであると仮定します。Class.getMethod詳細については、関連するメソッドとMethodそれ自体を参照してください。getDeclaredMethod代わりに必要な場合があり、アクセス可能にする必要がある場合があります。

可能であれば、これを回避する方法を考えられるかどうかを確認します。ただし、反射はすぐに乱雑になる傾向があります。一歩下がって、これが最良の設計であるかどうかを検討する価値があります。全体像の詳細を教えていただければ、代替案を提案できる可能性があります。

于 2012-05-09T06:19:30.457 に答える
0

反射を使用する別の方法があります。次のようなパターン マッチングを記述できます。

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

しかし、私はジョンに同意します:これを避けるようにしてください. パターン マッチングを使用する場合は、変更を 2 回適用する必要があります。たとえば、別のメソッドを追加する場合は、関数の名前付けメソッドとパターン マッチングに追加する必要があります。

于 2012-05-09T06:41:22.693 に答える