java - 在Scala中,给定一个子类,如何使用反射检查它是否覆盖其父接口(interface)(在Java中定义)的默认方法?

标签 java scala reflection

(defined in Java)
interface Foo {
  default int bar() {
    throw new RuntimeException("not implemented");
  }
}

(defined in Scala)
class FooImpl extends Foo {
  override int bar() {
    return 42;
  }
}

在上面的代码片段中,我有一个用 Java 定义的接口(interface),其默认方法 bar 只会抛出异常。问题是如何检查子类 FooImpl 是否覆盖默认方法。在Java中,我们似乎可以通过反射检查Method实例上的声明类:如果FooImpl覆盖该方法,则声明类将是其自身,否则将是接口(interface)Foo

但是,上面的内容在 Scala (2.12) 中似乎并不正确:在这两种情况下,声明类都将是 FooImpl

最佳答案

例如,如果我有这样的东西:

interface Test {
    default void go() {

    }
}

static class Impl implements Test, AutoCloseable {

    @Override
    public void go() {

    }

    @Override
    public void close() throws Exception {

    }
}

我可以通过以下方式查明方法 m 是否是您正在寻找的方法:

 private static boolean isDefaultAndOverridden(Method m, Class<?> cls) {

    Class<?>[] interfaces = ClassUtils.getAllInterfacesForClass(cls);
    System.out.println(Arrays.toString(interfaces));


    return Arrays.stream(interfaces)
                 .flatMap(in -> Arrays.stream(in.getDeclaredMethods()))
                 .filter(Method::isDefault)
                 .filter(method -> method.getName().equals(m.getName()))
                 .filter(method -> method.getReturnType() == m.getReturnType())
                 .filter(method -> Arrays.equals(method.getParameterTypes(), m.getParameterTypes()))
                 .count() == 1;

}    

我正在使用 Spring 中的 ClassUtils 来获取类直接或间接实现的所有接口(interface)。有许多库也公开了此类功能(但自己编写并不复杂)

关于java - 在Scala中,给定一个子类,如何使用反射检查它是否覆盖其父接口(interface)(在Java中定义)的默认方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66991432/

相关文章:

java - 如何使用 android 获取 Firebase 数据库中的子值?

scala - 关于缩写 map 的困惑

java - java中什么不是类的instanceof?

Java 从类构造通用实例

c# - AppDomain.CreateInstanceFromAndUnwrap 问题

java - 使用 Swing (netbeans) 在 SMSlib sendmessage 上添加进度条

java - 使用泛型的 JUnit 测试中的问题

java - 在我的 "Custom Set"实现中需要帮助

scala - IntelliJ Idea 找不到 sbt-idea-compiler-indices

scala - 为什么 Scala 将 List[Any] 提升为 List[Long]?