2011-02-04 28 views
7

私はchooseDialog(String s、int i)という静的メソッドを持っています。これは、chooseDialogに渡されたパラメータに基づいて、同じクラス(Dialogs.class)内の別のメソッドを呼び出したいものです。 sは目的のメソッドの名前で、iはその単一のパラメータです。Android/Java:リフレクションを使用したメソッドの呼び出し?

私は数多くのチュートリアルを試してきましたが、数時間かけてこの記事を読んだことがありますが、正確に何をする必要があるかをしっかりと把握できていないようです。

アイデア?

ありがとうございます!

+0

本当にリフレクションが必要ですか? – dacwe

+1

問題には良い解決策があるかもしれませんが、解決しようとしている実際の問題を投稿する方が良いかもしれません。例えば。なぜこのような方法選択をしたいのですか?かなりの頻度で、特定の質問に対するパー・フォース・ソリューションを見つける代わりに、基礎となる問題を解決するOOP設計パターンを見つけることができます。たとえば、ファクトリパターンが必要なものであれば、クラスを選択して抽象メッセージの実装として必要な機能を提供することができます。あなたの問題の詳細が、大きな画像を見失うことを許さないようにしてください。 – Ber

+0

このクラスの各メソッド(chooseDialog以外)は、一連の一意のアクション(それぞれ10+)を表し、この特定のクラスは300を超える方法から選択できます。これはちょうど私が行くための最善のルートと思われた。私は間違っていますか?より良い選択肢がありますか? – Jared

答えて

13

なぜStringパラメータで渡された名前のメソッドを呼び出すのですか?異なるアクションの定数を作成できないのですか?switchを使用し、いずれの場合もパラメータiのメソッドを呼び出しますか?

コンパイラがコードのエラーをチェックするメリットがあります。

編集:あなたは本当にリフレクションを使用したい場合は、とMethodオブジェクトを取得:

Method m = YourClass.class.getMethod("method_name",new Class[] { Integer.class }) 

私はInteger.classが働くかもしれないと思います。次に、あなただけのクラスに別の静的メソッドを呼び出したい場合は、すでに他のユーザーによって識別アプローチを使用することができます

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method 
+0

このクラスの各メソッド(chooseDialog以外)は、一連の一意のアクション(それぞれ10+)を表し、この特定のクラスは300を超える方法から選択できます。これはちょうど私が行くための最善のルートと思われた。私は間違っていますか?より良い選択肢がありますか? – Jared

+1

この膨大な数のメソッドを扱っている場合は、おそらく最高のものです。しかし、私は自分自身の誤植を恐れているだろう。 – Axarydax

+0

クラスパラメータを配列にラップする必要はありません。単にそれらを引数のリストとして指定することができます。例: 'YourClass.class.getMethod(" method_name "、Integer.class、String.class)'。 –

2
Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 
1

としてmetodを呼び出す:

Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 

をしかし、あなたがしたい場合静的メソッドを使用して非静的メソッドを呼び出すには、参照するオブジェクトを渡すか、非静的なダイアログを選択する必要があります。

function chooseDialog(Object o, String s, Integer i) { 
    Method method = Dialogs.getMethod(o, Integer.class); 
    method.invoke(o, i); 
} 

しかし、これは問題を処理する正しいOOP方法ではないと思います。また、あなたのコメントに基づいて、リフレクションは絶対に必要ではなく、chooseDialogで文字列を分析し、適切なメソッドに渡すことは、より型式の高いアプローチです。いずれの方法でも、単体テストは同じように見えるはずです。

if (s.equals("dialog1")) { 
     dialog1(i); 
    } 
関連する問題