我们走了,
我有一个标记界面:
interface IPOJO {
}
然后我有一个实现此接口的类:
class MePOJO implements IPOJO {
}
现在假设我有一个class object
持有MePOJO类的参考:
Class<MePOJO> classObj = MePOJO.class;
那么如何使用MePOJO
来确定IPOJO
类是否实现classObj
?
答案 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