2016-06-10 75 views
5
Parameter[] ps = method.getParameters(); 

Map<String,Integer> map = new HashMap<String,Integer>(); 

for(int ij = 0;ij<ps.length;ij++){ 

    Parameter p = ps[ij]; 

    RequestParam rp = p.getAnnotation(RequestParam.class); 

    if(rp != null){ 

     //do something 

    }else { 
     System.out.println(p.getType()); 
     System.out.println(p.getType().isInstance(HttpServletRequest.class)); 
     System.out.println(p.getType() == HttpServletRequest.class); 
    } 
} 

輸出爲:爲什麼parameter.getType()isInstance(HttpServletRequest.class)的回報是假的,但用 「==」 是真

interface javax.servlet.http.HttpServletRequest 
false 
true 

爲什麼要用 「isInstance」 是假的並使用「==」是真的? 因爲「實例」無法判斷實現關係嗎?

回答

5

isInstance等於}這種

此方法是Java語言的instanceof 操作者的動態等效。

該方法返回false,因爲你是比較一個類到另一個類HttpServletRequest.class採用這個方法(通過p.getType()返回)希望有一個實例,例如:

Dog bobby = new BobbyDog(); // class BobbyDog extends Dog 
System.out.println(Dog.class.isInstance(bobby)); // correct use (return true) 
System.out.println(Dog.class.isInstance(BobbyDog.class)); // incorrect use (return false) 

等於運算因爲這兩個類是相等的

p.getType() == HttpServletRequest.class // true 
HttpServletRequest.class == HttpServletRequest.class // true 

返回true,如果你想實現法官必須使用方法

關係
isAssignableFrom(Class<?> cls) 

確定是否此Class對象所表示的類 或接口或者是相同,或 是超類或超接口的,類或接口 由指定的類的參數來表示。如果是的話,它返回true; 否則返回false。如果此Class對象表示一個 基元類型,則此方法返回true,如果指定的類 參數恰好是此Class對象;否則返回false。

7

該類型不是HttpServletRequest類的實例,它是java.lang.Class的一個實例,其中包含有關HttpServletRequest類的信息。

相關問題