对于给定的接口(interface) IfA
与类A
实现它和类 B
延伸A
,我想确定这两个类中的哪一个 A
和B
显式声明实现接口(interface) IfA
.
显然IfA.class.isAssignableFrom(A.class)
和IfA.class.isAssignableFrom(B.class)
都是true
。我希望有一个像
B.class.declaresInterface(IfA.class)
-> false
A.class.declaresInterface(IfA.class)
-> true
但是这样的东西并不存在,不是吗?
背景:来自某个变量Class<? extends IfA> x
;不知道它是 A、B 还是其他扩展 A 或 B 的 C 类...我想搜索实现该接口(interface)的最上层父类(super class)。目前我暗示对此进行有点难看的搜索:
public class SomeTest {
@org.junit.Test
public void testIt() {
assertTrue(IfA.class.isAssignableFrom(A.class));
assertTrue(IfA.class.isAssignableFrom(B.class));
Class<? extends IfA> b = B.class;
Class<?> result = b;
// somewhat ugly search: from B.class find A.class
while (IfA.class.isAssignableFrom(result.getSuperclass())) {
result = result.getSuperclass();
}
Object s = result.getSuperclass();
assertSame(A.class, result);
assertFalse(IfA.class.isAssignableFrom(result.getSuperclass()));
}
interface IfA {
};
class A implements IfA {
};
class B extends A {
};
}
有没有更明确的接口(interface)检测方式,让搜索更容易理解?
最佳答案
据我所知,没有 declaresInterface(...)
JDK 本身中的方法,尽管可能有一个库提供了该方法。
Class
类本身提供了一个名为 getInterfaces()
的方法根据 JavaDoc:
Returns the interfaces directly implemented by the class or interface represented by this object.
因此实现 boolean declaresInterface(Class<?> clazz, Class<?> interface )
应该非常简单(尽管使用一些缓存可能会提高性能):
boolean declaresInterface(Class<?> clazz, Class<?> iface) {
//note: you should add some checks, e.g. for null and correct types
return Arrays.stream( clazz.getInterfaces() )
.anyMatch( iface::equals );
}
测试:
//true because Integer implements Comparable<Integer>
declaresInterface( Integer.class, Comparable.class );
//false, because Integer extends Number and Number implements Serializable
declaresInterface( Integer.class, Serializable.class );
关于java - 查明类是否显式声明实现特定接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57463723/