2012-05-09 29 views
2

変数String func = "validate";に格納されている汎用文字列を持っています。その名前の関数を呼び出したいとします。つまり、validate()関数を呼び出す必要があります。
私はいくつかの機能
public void callFunc(String func){
....
}
そうに変数を渡します言うことを意味し、上記の機能はcallfunc()にパラメータとして渡された関数名を持つ適切な関数を呼び出す必要があります。Java:文字列変数に名前が格納されている関数を呼び出す方法

+3

リフレクションの使用: –

+0

一般的な例として、適切なJDBCドライバをClass.forName()でロードしています。http://www.xyzws.com/Javafaq/what-does-classforname-method-do/17 – paulsm4

答えて

14

あなたです。あなたを想定しています

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

はもちろん、this上のメソッドを呼び出したい、それがインスタンスメソッドだという。詳細はMethodと一緒にClass.getMethodと関連する方法をご覧ください。代わりにgetDeclaredMethodが必要な場合があり、アクセス可能にする必要があります。

可能であれば、これを回避する方法を考えることができますか?反射は、すばやく面倒くなる傾向があります。一歩踏み出し、これが最高のデザインかどうか検討する価値があります。より大きな画像の詳細を私たちに伝えれば、代替案を提案することができます。

+0

ありがとうlot ... .. –

+0

'func(val1、val2)'関数にパラメータを渡したい場合 –

+1

@ShamsUdDin:次に 'invoke(this、val1、val2)'を使います。私がリンクしたドキュメントを読んでください。 –

0

反射を使用する別の方法があります。

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

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

+0

私たちがスイッチ関数を使用すると、私たちのコードは一般的になりません。私は 'mypage()'という新しい関数を作成したとします。スイッチ機能のmypageケース。 –

+0

それはまさに私が底で言ったことです。 –

関連する問題