java - 查明类是否显式声明实现特定接口(interface)

标签 java

对于给定的接口(interface) IfA与类A实现它和类 B延伸A ,我想确定这两个类中的哪一个 AB显式声明实现接口(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/

相关文章:

java - 找不到 Maven 插件

java - JOptionPane 背景图片

java - 帮助在 Java 中将颜色十六进制存储为整数

java - 从文本字段中获取文本

java - 如何在 Spring Boot 中建立数据库连接之前运行自定义代码?

java - 运行 spring 服务器时 JRebel-JVMTI 错误

java - 我只是想知道为什么它必须在第二个循环中加入线程

java - 如果字符串太长,则将字符串拆分为 List<String>

java - 开始Java : passing to a constructor thru event listener

java基础问题