0

私は最近JavaでReflectionsを見てきましたが、簡単な例を考え出しました

Reflection.java

 import java.lang.reflect.*;

  public class Reflection{
  }

  public static void main(String args[])
  {
     try {
       Class cls = Class.forName("Method");

        Method methlist[] 
          = cls.getDeclaredMethods();
        for (int i = 0; i < methlist.length;
           i++) {  
           Method m = methlist[i];
           System.out.println("name 
             = " + m.getName());
           System.out.println("decl class = " +
                          m.getDeclaringClass());
           Class pvec[] = m.getParameterTypes();
           for (int j = 0; j < pvec.length; j++)
              System.out.println("
               param #" + j + " " + pvec[j]);
           Class evec[] = m.getExceptionTypes();
           for (int j = 0; j < evec.length; j++)
              System.out.println("exc #" + j 
                + " " + evec[j]);
           System.out.println("return type = " +
                              m.getReturnType());
           System.out.println("-----");
        }
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }
 }

Method.java

 public class Method {
  private int f1(
   Object p, int x) throws NullPointerException
  {
     if (p == null)
        throw new NullPointerException();
     return x;
  }

Method.java上記の例から、次のようなすべての情報を返すことができます

name = f1
decl class = class Method
param #0 class java.lang.Object
param #1 int
exc #0 class java.lang.NullPointerException
return type = int
-----
name = main
decl class = class method1
param #0 class [Ljava.lang.String;
return type = void
-----

しかし、私の質問は、次のようなものでテストMethod.javaする方法はありますか?Reflection.java

int x = cls.getMethod("f1", Object = anObject, Integer.TYPE = 2 )
System.out.println(x);

そして、f1にオブジェクトが渡されたので、コンソールは2を出力する必要がありますか?

4

3 に答える 3

1

のJavadoc をjava.lang.reflect.Method確認してください。メソッドが必要ですinvoke()

Method m = ...
Object result = m.invoke(objectToCallMethodOn, firstArgument, secondArgument);
int x = ((Integer) result).intValue();
于 2012-08-03T16:16:01.470 に答える
1

のインスタンスを作成し、2 つのパラメーターを使用してプライベート メソッドMethod呼び出す必要があります。f1オブジェクトを返します。コードにはいくつかの落とし穴がありますが、ここに実用的な解決策があります (注:名前の衝突を避けるために、Methodクラスの名前を次のように変更しました:MyMethod

Method f1Method = MyMethod.class.getDeclaredMethod("f1", Object.class, int.class);
f1Method.setAccessible(true);
int result = (Integer) f1Method.invoke(new MyMethod(), 
                           new Object[]{new Object(), 2});
System.out.println(result);
  • メソッドはプライベートであるため、宣言されたメソッドを取得してアクセス可能にする必要があります
  • メソッドは静的ではないため、メソッドを呼び出すには MyMethod のインスタンスが必要です
  • Java プリミティブ型を受け渡します。int.class許可されています。JavaDoc は、値がプリミティブ型の場合、最初に object に適切にラップされることを示しています。のインスタンスを受け取りますInteger
于 2012-08-03T16:23:36.407 に答える
0

注:Method私が参照するMethodクラスは JDKのクラスであり、例のクラスではありません

Methodオブジェクトからをすでに見つけることができClassます。Method#invokeメソッドを使用して、特定のオブジェクトでメソッドを呼び出すことができるようになりました

于 2012-08-03T16:16:16.817 に答える