2011-04-07 17 views
14

請看下面的示例,第一次調用getMethod()會在Eclipse中產生警告。第二個不起作用,並以NoSuchMethodException失敗。類型null的參數應明確地轉換爲類<?> []用於調用可變參量方法

The argument of type null should explicitly be cast to Class<?>[] for the invocation of the varargs method getMethod(String, Class<?>...) from type Class<Example> . It could alternatively be cast to Class for a varargs invocation.

我跟着警告,沒有任何工作了。

import java.lang.reflect.Method; 


public class Example 
{ 
    public void exampleMethod() { } 

    public static void main(String[] args) throws Throwable 
    { 
    Method defaultNull = Example.class.getMethod("exampleMethod", null);   
    Method castedNull = Example.class.getMethod("exampleMethod", (Class<?>) null); 
} 
} 

第二個電話會產生這樣的錯誤:

Exception in thread "main" java.lang.NoSuchMethodException: 
    Example.exampleMethod(null) 
     at java.lang.Class.getMethod(Class.java:1605) 
     at Example.main(Example.java:12) 

有人能解釋這種現象給我嗎?什麼是避免警告的正確方法?

回答

36

getMethod方法的第二個參數是一個VarArg參數。 正確的用法是: 如果反射方法沒有參數,則不應指定第二個參數。 如果反射的方法有參數,所以每個參數應該在未來的方式規定:

import java.lang.reflect.Method; 


public class Example { 

    public void exampleMethodNoParam() { 
     System.out.println("No params"); 
    } 

    public void exampleMethodWithParam(String arg) { 
     System.out.println(arg); 
    } 

    public static void main(String[] args) throws Throwable { 
     Example example = new Example(); 
     Method noParam = Example.class.getMethod("exampleMethodNoParam"); 
     Method stringParam = Example.class.getMethod("exampleMethodWithParam", String.class); 
     noParam.invoke(example); 
     stringParam.invoke(example, "test"); 
     //output 
     //No params 
     //test 
    } 
} 

UPDATE

所以,你的情況,當你指定null編譯器不知道是什麼你指定的類型。當您嘗試null轉換爲類,這是未知的,但反正是一個類,因爲沒有exampleMethod的

public void exampleMethod(Class<?> object) { }

簽名得到一個異常。

+0

鑄造'null'與未發現的'null'有什麼區別?我在JDK源代碼中看不到這一點。 – codevour 2011-04-08 07:14:55

+0

請查看更新後的帖子。 – StKiller 2011-04-08 07:23:39

1

您沒有投下nullClass<?>[],您將它投射到Class<?>。由於沒有方法匹配該簽名,它會拋出異常。更正您的演員以正確識別陣列。

+0

即使null被轉換爲類 []我不認爲這會工作...然後,反射會尋找一個方法,帶一個對象數組?其中也不存在。 – mmccomb 2011-04-07 20:11:20

4

實現getMethod在Java API定義是:

Method java.lang.Class.getMethod(String name, Class<?>... parameterTypes) 

如果調用的方法沒有參數,那麼應該提供一個空的陣列或具有0長度的陣列,用於在第二argument.like此:

Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]); 

調用方法,你也應該設置一個空數組。

defaultNull.invoke(example , new Object[0]); 
相關問題