2012-06-09 103 views
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? 謝謝。

回答

8

後固定的拼寫錯誤,你還在找錯了方法:

的方法被定義爲:

getCompositeMessage(Type... strings) 

,但你正在尋找

getCompositeMessage() 

不帶參數。

您需要使用:

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

下一個問題將是要進行的調用(),要傳遞的類引用在方法應該被調用的對象代替。

下一個錯誤是,你沒有傳遞正確的函數的自變量:

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

而接下來的問題是,你要輸出在下面的方法,而不是方法對象的結果行:

System.out.println(o); 
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"}; 
+0

類型[]類是由於仿製藥在Java中的工作方式是非法的。 –

+0

@HendrikBrummermann哦,對不起,沒有意識到類型是一個泛型參數 –

+0

java.lang.IllegalArgumentException異常:對象是不sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)宣佈 類\t的實例 \t在陽光下.reflect.NativeMethodAccessorImpl.invoke(未知來源) \t在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知來源) \t在java.lang.reflect.Method.invoke(未知來源) \t在test1.Main.main(主。java:27) – user710818

相關問題