开始了,
我有一个标记界面:
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
有几种方法可以做到这一点。
通过使用您创建的对象的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));
这样做的正确方法根本不是使用标记接口,而是使用注释:
@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
这样你就不会用标记接口污染命名空间。
检查关键字 instanceOf
if(classObj instanceOf IPOJO ){
}
当且仅当对象的运行时类型与类或接口的赋值兼容时,instanceof运算符的计算结果为 true。
还有类成员允许您获取对象的超类的名称。http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
使用 Class 中的 isInstance 方法:
if (classObj.isInstance(myObj)){
...
}
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html