0
public class Test1<Type>
{
    public Type getCompositeMessage(Type... strings)
    {
        Type val = (Type) "";

        for (Type str : strings) {
            val = (Type) ((String)val + (String)str);
        }
        return val;
    }
}

取得方法:

try
{
    Class<?> c = Class.forName("test1.Test1");
    Method[] allMethods = c.getDeclaredMethods();
    for (Method m : allMethods) {
        String mname = m.getName();
        System.out.println(mname);
    }

    Method m = c.getMethod("getCompositeMessage");
    m.setAccessible(true);
    Object o = m.invoke(c, "777777777777777777777777");
    System.out.println(m);
}
catch (Exception e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

出力:

getCompositeMessage
java.lang.NoSuchMethodException: test1.Test1.getCompositeMessage()
at java.lang.Class.getMethod(Unknown Source)
at test1.Main.main(Main.java:25)

しかし、メソッドの名前はまったく同じです!NoSuchMethodException を受け取るのはなぜですか? ありがとう。

4

2 に答える 2

8

スペルミスを修正した後も、間違ったメソッドを探しています。

メソッドは次のように定義されます。

getCompositeMessage(Type... strings)

しかし、あなたは探しています

getCompositeMessage()

パラメータなし。

以下を使用する必要があります。

c.getMethod("getCompositeMessage", Object[].class);

次の問題は、invoke() の呼び出しです。メソッドを呼び出すオブジェクトではなく、クラス参照を渡しています。

次のバグは、関数に正しい引数を渡していないことです:

 Object o = m.invoke(new Test1<String>(), new Object[] {
          new String[] {"777777777777777777777777"}});

そして次の問題は、次の行でメソッドオブジェクトの代わりにメソッドの結果を出力したいということです:

System.out.println(o);
于 2012-06-09T10:06:43.617 に答える
3

を使用して見つけることができます

Test1.class.getDeclaredMethod("getCompositeMessage", Type[].class);

(これは、クラスまたはインターフェイスの場合に当てはまりTypeます。これは、これを探している汎用パラメーターであるためです:)

Test1.class.getDeclaredMethod("getCompositeMessage", (Object) Object[].class);

そして、あなたが得ているエラーは、最初のパラメータがクラス Object ではなくインスタンスである必要があるという事実から生じます。

違う:

Object o = m.invoke(c /* c is a class Object, but it must be an instance */,
                    "777777777777777777777777" /* this must be an array */);

右:

Type1<String> t = new Type1<String>();
Object o = m.invoke(t, new Object[]{"foo", "bar"};
于 2012-06-09T10:27:16.867 に答える