23

呼び出したいメソッド (公開されていることはわかっていますが、リフレクションを使用する必要があります):

public byte[] myMethod()  

私はMethodこのようなオブジェクトを取得し、m含みますmyMethod()(デバッガーで確認しました)

Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod");

最後に、m を呼び出して結果をオブジェクトに渡す必要があります。

byte[] myBytes = null;
m.invoke(myBytes);

例外はスローされませんが、myBytesnull のままです...さらに成功せずに次のことも試しました:

m.invoke(myBytes, (Object[])null);

myBytes への呼び出しの結果を取得するにはどうすればよいですか?

4

3 に答える 3

33

例外はスローされませんが、myBytesはnullのままです

正解です。必要なものは次のとおりです。

byte[] myBytes = (byte[])m.invoke(yourInstance);

詳細については、ドキュメントをご覧ください。ノート:

  • メソッドの戻り値は、の戻り値ですinvoke
  • の最初の引数invokeは、メソッドを呼び出すインスタンスです(静的メソッドではなく、インスタンスメソッドをリストしているため、静的な場合、最初の引数はnull)になります。インスタンスを参照する変数はどこにも表示されていないのでyourInstance、上記で呼び出しました。
于 2013-01-21T17:16:56.880 に答える
13

myBytes 現在、の値をメソッドに渡しています。これは、呼び出すターゲットオブジェクトであるかのように行われます。戻り値です。

あなたが欲しい:

byte[] myBytes = (byte[]) m.invoke(target);

target呼び出したいインスタンスはどこにありますか(インスタンスメソッドであるため)。

インスタンスがない場合、メソッドは静的メソッドである必要があります。その時点で、呼び出しを次のように変更します。

byte[] myBytes = (byte[]) m.invoke(null);
于 2013-01-21T17:17:29.887 に答える
0

invokemethod は最初の引数をメソッドのインスタンス オブジェクトとして受け取り、その後にパラメーターが続きます。ここでメソッドシグネチャはpublic byte[] myMethod()

呼び出すコードmyMethod:

byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance());
于 2014-11-30T16:39:02.570 に答える