2

开始了,

我有一个标记界面:

interface IPOJO {
}

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

class MePOJO implements IPOJO {
}

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

Class<MePOJO> classObj = MePOJO.class;

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

4

6 回答 6

8

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

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

输出:

true
于 2013-08-02T14:42:22.493 回答
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));
于 2013-08-02T14:35:03.987 回答
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

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

于 2013-08-02T14:44:34.247 回答
2

检查关键字 instanceOf

if(classObj  instanceOf IPOJO ){

}

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

于 2013-08-02T14:35:13.497 回答
1

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

于 2013-08-02T14:38:21.633 回答
1

使用 Class 中的 isInstance 方法:

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

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

于 2013-08-02T14:44:29.247 回答