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

Java 如何检查类是否实现了接口,java,interface,implements,Java,Interface,Implements,好了 我有一个标记接口: interface IPOJO { } 然后我有一个实现这个接口的类: class MePOJO implements IPOJO { } 现在假设我有一个类对象保存类MePOJO的引用: Class<MePOJO> classObj = MePOJO.class; Class classObj=MePOJO.Class; 那么,我如何确定MePOJO类是否仅仅通过使用classObj实现了IPOJO?有几种方法可以实现这一点 使用您创建的对象类型,

好了

我有一个标记接口:

interface IPOJO {
}
然后我有一个实现这个接口的类:

class MePOJO implements IPOJO {
}
现在假设我有一个
类对象
保存类MePOJO的引用:

Class<MePOJO> classObj = MePOJO.class;
Class classObj=MePOJO.Class;

那么,我如何确定
MePOJO
类是否仅仅通过使用
classObj
实现了
IPOJO

有几种方法可以实现这一点

使用您创建的对象类型,检索列表及其实现的所有接口

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 clazz=MePOJO.Class;
System.out.println(IPOJO.class.isAssignableFrom(clazz));

检查关键字
instanceOf

if(classObj  instanceOf IPOJO ){

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


还有一些类成员允许您获取对象的超类的名称

您应该在此处使用方法:

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

使用方法isInstance from类:

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

正确的方法不是使用标记接口,而是使用注释:

@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
true

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

为什么不简单地使用关键字
instanceof
?这是正确的答案,但为了完整性,请注意
OP
具有
对象,而不是
MePOJO
的实例,所以这根本不是正确的答案。我已经更新了我的答案并总结了几种可能的方法。我认为应该删除第一个选项,因为OP没有指定MePOJO类是否具有默认构造函数。在第二个选项中,不需要创建新实例。您只需执行
MePOJO.class.getInterfaces()小心使用
getInterfaces()
它做的事情与
instanceof
:+1这是正确的答案。同样有效:
IPOJO.class.isAssignableFrom(MePOJO.class))
@c.s..是的,同样有效
classObj
不过是
MePOJO.class
而已。取决于您打算如何处理这些标记。如果您想将可能接受任何
对象的方法限制为只接受标记的方法,则更容易让它们实现接口,因为您会遇到编译时错误,而不必在运行时检查它们是否有注释<例如,code>Serializable
。我认为这不是一个标记接口,因为继承适用。您只想接受
Foo
。根据定义,标记接口在继承之外。嗯,如果这样定义的话,+1
true