java - Java 8 接口(interface)中的默认方法和 Bean Info Introspector

标签 java interface javabeans java-8 propertydescriptor

我对 Interface 和 BeanInfo Introspector 中的默认方法有一个小问题。 在这个例子中,有接口(interface):Interface

public static interface Interface {
    default public String getLetter() {
        return "A";
    }
}

还有两个类ClassA和ClassB:

public static class ClassA implements Interface {
}

public static class ClassB implements Interface {
    public String getLetter() {
        return "B";
    }
}

在 main 方法中,app 从 BeanInfo 打印 PropertyDescriptors:

public static String formatData(PropertyDescriptor[] pds) {
    return Arrays.asList(pds).stream()
            .map((pd) -> pd.getName()).collect(Collectors.joining(", "));

}

public static void main(String[] args) {


    try {
        System.out.println(
                formatData(Introspector.getBeanInfo(ClassA.class)
                        .getPropertyDescriptors()));
        System.out.println(
                formatData(Introspector.getBeanInfo(ClassB.class)
                        .getPropertyDescriptors()));
    } catch (IntrospectionException e) {
        e.printStackTrace();
    }

}

结果是:

class
class, letter

为什么默认方法“字母”在 ClassA 中作为属性不可见?是错误还是功能?

最佳答案

我想,Introspector 不处理 interface 层次结构链,即使使用 Java 8 虚拟扩展方法(又名防御者,默认方法)接口(interface)可以有一些有点看起来像属性方法。这是一个相当简单的内省(introspection)器,声称它确实如此:BeanIntrospector

这是否可以被认为是一个错误在某种程度上是一个灰色地带,这就是我这么认为的原因。

显然,现在一个类可以从一个接口(interface)“继承”一个方法,该方法具有官方认为的 getter/setter/mutator 的所有特性。但与此同时,这整个事情都违背了接口(interface)的目的——接口(interface)不可能提供任何可以被视为属性的东西,因为它是无状态和无行为的,它只是为了描述行为。即使防御者方法基本上也是静态的,除非它们访问具体实现的真实属性。

另一方面,如果我们假设防御者是正式继承(而不是提供默认实现,这是一个相当模糊的定义),它们应该产生合成方法在实现类中创建,并且那些属于该类并作为 PropertyDescriptor 查找的一部分遍历。 显然这不是它的方式,否则整个事情就会正常进行。 :) 防御者方法似乎在这里得到了某种特殊对待。

关于java - Java 8 接口(interface)中的默认方法和 Bean Info Introspector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23219006/

相关文章:

java - 如何在 Java 中用 XML 标签包装 XML 文本内容?

Java游戏数据结构

spring 使用 ApplicationContex.getBean() 和 @Autowired 有什么不同?我如何决定选择哪一个?

java - 您可以使用 JDBI、@BindBean、@SqlQuery 注释调用对象上的方法吗?

java - 如何检测JavaBean类已更改(isDirty)

java - 如何在动画结束后开始新的 Activity ?

java - Productbuild --distribution : package xxx. 无法加载 pkg

java - 如何在 Fragment 和适配器之间创建接口(interface)?

java - 在 Java 中,当一个接口(interface)扩展另一个接口(interface)时,为什么要在子接口(interface)中重新声明一个方法?

C# 破解 : low level difference between interface and abstract class