2013-08-02 180 views
1

在這裏我們去,如何檢查是否一個類實現一個接口

我有一個標記接口:

interface IPOJO { 
} 

有時我會實現這個接口的類:

class MePOJO implements IPOJO { 
} 

現在假設我有一個class object等級MePOJO的參照:

Class<MePOJO> classObj = MePOJO.class; 

那麼我怎樣才能確定MePOJO類實施IPOJO僅僅使用classObj

+2

爲什麼不簡單地使用關鍵字'instanceof'? – Shark

回答

5

您應該使用Class#isAssignableFrom(Class<?> cls)方法在這裏:

Class<?> classObj = MePOJO.class; 
System.out.println(IPOJO.class.isAssignableFrom(classObj)); 

輸出:從類

true 
+0

+1這是正確的答案。也可以工作:'IPOJO.class.isAssignableFrom(MePOJO.class))' –

+0

@ c.s ..也可以工作。 'classObj'只不過是'MePOJO.class'。 –

5

這有幾種方法。

無論使用Class型你已經創建並檢索與所有它實現的接口列表中的對象的。

MePOJO test = new MePOJO(); 
Class[] interfaces = test.getClass().getInterfaces(); 
for (Class c : interfaces) { 
    if ("IPOJO".equals(c.getSimpleName()) { 
     System.out.println("test implements IPOJO"); 
    } 
} 

或者使用Class#isAssignableFrom(Class clazz)方法:

Class<?> clazz = MePOJO.class; 
System.out.println(IPOJO.class.isAssignableFrom(clazz)); 
+0

這是正確的答案,但爲了完整起見,[反射](http://docs.oracle.com/javase/6/docs/api/java/lang/Class。html#getInterfaces()) – rocketboy

+0

請注意,'OP'有'Class '對象,而不是'MePOJO'的實例,所以這是不正確的答案。 –

+0

我已經更新了我的答案並總結了幾種可能的方法。 –

1

檢查用關鍵字instanceOf

if(classObj instanceOf IPOJO){ 

} 

instanceof運算符計算爲真,當且僅當對象的運行時類型賦值與類或接口兼容。

3

正確的方法做,這是不是在所有的標記接口,但與註釋:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public static @interface Pojo { 
} 

@Pojo 
public static class MePojo { 
} 

public static void main(String[] args) throws Exception { 
    System.out.println(MePojo.class.isAnnotationPresent(Pojo.class)); 
} 

輸出:

true 

這樣,你不污染與標記接口的命名空間。

+0

取決於你打算如何處理這些標記。如果你想限制可以接受任何Object的方法,只接受標記的方法,讓它們實現接口更容易,因爲你得到編譯時錯誤,而不必在運行時檢查它們是否有註解。例如'Serializable'。 – zapl

+0

我不認爲這是一個標記接口,然後因爲繼承適用。你只想接受'Foo'。根據定義,標記接口不在繼承之列。 –

+0

@BoristheSpider +1 – VishalDevgire

相關問題