web-dev-qa-db-ja.com

リフレクションを使用してパラメーターを持つメソッドを呼び出すにはどうすればよいですか?

これが私のクラスです:

_public class A{
    private void doIt(int[] X, int[] Y){
       //change the values in X and Y
    }
}
_

doItを使用して2つの配列を変更しようとしている別のクラスがあります。コードにエラーがありますが、見つかりません。

_public class B{
  public void myStuff(){
    A myA = new A();
    int[] X = {1,2,3,4,5};
    int[] Y = {4,5,6,7,8,9};
    Method doIt = A.class.getDeclaredMethod("doIt",new Object[]{X,Y}); // error
    doIt.setAccessible(true);
    doIt.invoke(myA,new Object[]{X,Y});
  }
}
_

メソッドmyStuffを修正する方法について何か助けはありますか?

getDeclaredMethod("doIt",new Object[]{X,Y});を使用すると、コードがコンパイルされません。

代わりにgetDeclaredMethod("doIt",null);がある場合は、NoSuchMethodExceptionと表示されます。

18
kasavbere

メソッドは2つのint配列で宣言されています

private void doIt(int[] X, int[] Y)

また、そのメソッドを見つけたい場合は、同じ名前でタイプが異なる他のメソッドが見つからないように、引数のタイプも設定する必要があります。

A.class.getDeclaredMethod("doIt", int[].class, int[].class)
23
Pshemo

doItメソッドはtwoパラメーターを取ります。したがって、メソッド名に加えて、twoパラメーターを Class#getDeclaredMethod() に渡す必要があります。 2つの追加パラメーターは、 Class のインスタンスである必要があります。これはObject[]は明らかにではありません。具体的には、これらのClassインスタンスは、doItが受け入れるパラメーターのタイプと同じである必要があります。

Method doIt = A.class.getDeclaredMethod("doIt", int[].class, int[].class);
4
Matt Ball

そうではないですか?

Method doIt = A.class.getDeclaredMethod("doIt", int[].class, int[].class);
3
Edwin Dalorzo