如何检查类是否实现了接口

时间:2013-08-02 14:34:05

标签: java interface implements

我们走了,

我有一个标记界面:

interface IPOJO {
}

然后我有一个实现此接口的类:

class MePOJO implements IPOJO {
}

现在假设我有一个class object持有MePOJO类的参考:

Class<MePOJO> classObj = MePOJO.class;

那么如何使用MePOJO来确定IPOJO类是否实现classObj

6 个答案:

答案 0 :(得分:6)

您应该在这里使用Class#isAssignableFrom(Class<?> cls)方法:

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

输出:

true

答案 1 :(得分: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));

答案 2 :(得分: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

这样您就不会使用标记接口污染命名空间。

答案 3 :(得分:2)

使用关键字instanceOf

进行检查
if(classObj  instanceOf IPOJO ){

}
  

当且仅当对象的运行时类型与类或接口兼容时,instanceof运算符的计算结果为true。

答案 4 :(得分:1)

还有类成员允许您获取对象的超类的名称。 http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

答案 5 :(得分:1)

使用方法isInstance from Class:

if (classObj.isInstance(myObj)){
     ...
}

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html