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