在这里我们去,如何检查是否一个类实现一个接口
我有一个标记接口:
interface IPOJO {
}
有时我会实现这个接口的类:
class MePOJO implements IPOJO {
}
现在假设我有一个class object
等级MePOJO的参照:
Class<MePOJO> classObj = MePOJO.class;
那么我怎样才能确定MePOJO
类实施IPOJO
仅仅使用classObj
?
在这里我们去,如何检查是否一个类实现一个接口
我有一个标记接口:
interface IPOJO {
}
有时我会实现这个接口的类:
class MePOJO implements IPOJO {
}
现在假设我有一个class object
等级MePOJO的参照:
Class<MePOJO> classObj = MePOJO.class;
那么我怎样才能确定MePOJO
类实施IPOJO
仅仅使用classObj
?
您应该使用Class#isAssignableFrom(Class<?> cls)
方法在这里:
Class<?> classObj = MePOJO.class;
System.out.println(IPOJO.class.isAssignableFrom(classObj));
输出:从类
true
+1这是正确的答案。也可以工作:'IPOJO.class.isAssignableFrom(MePOJO.class))' –
@ c.s ..也可以工作。 'classObj'只不过是'MePOJO.class'。 –
这有几种方法。
无论使用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));
这是正确的答案,但为了完整起见,[反射](http://docs.oracle.com/javase/6/docs/api/java/lang/Class。html#getInterfaces()) – rocketboy
请注意,'OP'有'Class >'对象,而不是'MePOJO'的实例,所以这是不正确的答案。 –
我已经更新了我的答案并总结了几种可能的方法。 –
还有一些类成员可以让你获得对象的超类的名字。 http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
使用方法isInstance:
if (classObj.isInstance(myObj)){
...
}
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html
正确的方法做,这是不是在所有的标记接口,但与注释:
@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
这样,你不污染与标记接口的命名空间。
取决于你打算如何处理这些标记。如果你想限制可以接受任何Object的方法,只接受标记的方法,让它们实现接口更容易,因为你得到编译时错误,而不必在运行时检查它们是否有注解。例如'Serializable'。 – zapl
我不认为这是一个标记接口,然后因为继承适用。你只想接受'Foo'。根据定义,标记接口不在继承之列。 –
@BoristheSpider +1 – VishalDevgire
为什么不简单地使用关键字'instanceof'? – Shark