在我的应用程序中,当一个类的getter只有在接口中默认时(Java 8特性),就没有Java Beans属性。也就是说,对于普通方法调用,它的工作方式与标准方法相同,但对于通过“属性”访问时,它会突然表现出不同的行为...
以下是一个测试案例:
以下是一个测试案例:
import java.beans.Introspector;
import java.util.Arrays;
import java.util.stream.Collectors;
import org.apache.commons.beanutils.PropertyUtils;
public class test
{
public static void main (String[] arguments) throws Exception
{
// Normal language-level invocation, works fine.
System.out.println (new Bean1 ().getFoo ());
System.out.println (new Bean2 ().getFoo ());
// Printing Java Beans properties; Bean2 doesn't have 'foo' property...
System.out.println (Arrays.stream (Introspector.getBeanInfo (Bean1.class).getPropertyDescriptors ())
.map ((property) -> property.getName ())
.collect (Collectors.joining (", ")));
System.out.println (Arrays.stream (Introspector.getBeanInfo (Bean2.class).getPropertyDescriptors ())
.map ((property) -> property.getName ())
.collect (Collectors.joining (", ")));
// First call behaves as expected, second dies with exception.
System.out.println (PropertyUtils.getProperty (new Bean1 (), "foo"));
System.out.println (PropertyUtils.getProperty (new Bean2 (), "foo"));
}
public interface Foo
{
default String getFoo ()
{
return "default foo";
}
}
public static class Bean1 implements Foo
{
@Override
public String getFoo ()
{
return "special foo";
}
}
public static class Bean2 implements Foo
{ }
}
结果:
special foo
default foo
class, foo
class
special foo
Exception in thread "main" java.lang.NoSuchMethodException: Unknown property 'foo' on class 'class test$Bean2'
at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1257)
at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:808)
at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:884)
at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:464)
at test.main(test.java:21)
问题: 我是做错了什么还是Java里有个bug?除了永远不使用默认方法(用于getter/setter)以防在以后某个时刻需要将它们作为“属性”访问之外,是否还有其他解决方法?
我一直讨厌Java中的“约定属性”,因为它们往往会因为你打喷嚏而破坏。
@Override public Foo getFoo () { return MyInterface.super.getFoo (); }
... - user319799