2013-08-02 137 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

相关问题