4

文字列の引数を持つ、呼び出したいメソッドがあるとします。

呼び出すには、次のようにします。myFunction(stringValue);

さて、同じ呼び出しをどのように行うのでしょうか。ただし、値が「myFunction」の文字列がある場合は動的に呼び出します。

何かのようなもの

method = [convert "myFunction" string to method];
method.invoke(stringValue);

私は現在、次のようなことを試みています

java.lang.reflect.Methodメソッド;

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class);
method.invoke (stringValue);

しかし、エラー IllegalArgumentExceptionメッセージがcom.blah.MyActivityタイプのレシーバーを予期していましたが、java.lang.Stringを取得しました

4

2 に答える 2

4

命令:

method.invoke (stringValue);

methodが呼び出されるオブジェクトが必要です。

したがって、次のようなことを試してみると:

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class);
method.invoke(someInstanceOfMyActivity, stringValue);

それが動作します。

ドキュメント: http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html

于 2012-06-28T18:08:48.183 に答える
3

上記の私のコメントをフォローアップしてください:

これを実行して呼び出しcom.blah.MyActivity::myFunctionます:

com.blah.MyActivity activity = new com.blah.MyActivity() ;

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class);
method.invoke (activity, stringValue);

(c++ 構文を許してください)

なぜそれがこのように機能するのかを説明しようとします:

メソッドは、実際には特別なタイプの関数にすぎません.クラスやオブジェクトを処理できるようにするために作成された便利な機能です..

ご存知のように、メソッド内には常にthis変数があります。この舞台裏では、これはパラメーターとして渡されますが、代わりに次のように記述します。

com.blah.MyActivity activity = new com.blah.MyActivity() ;
com.blah.MyActivity::myFunction( activity, stringValue )

これを便利に書くことができます:

com.blah.MyActivity activity = new com.blah.MyActivity() ;
activity.myFunction(stringValue)

リフレクションを使用してメソッドを取得すると、それは単なる「通常の関数」です。this直接呼び出すには、パラメーターを渡す必要があります。

そのため、型エラーが発生しています... myFunction は、最初の隠し引数が、省略したクラスを含むインスタンスであると想定しています。

HTH

于 2012-06-28T22:45:09.757 に答える