Trong ứng dụng của tôi, tôi gặp phải vấn đề khi một getter trong một lớp được mặc định trong một giao diện (tính năng Java 8), không có thuộc tính Java Beans như một kết quả. I E. cho phương pháp gọi bình thường nó hoạt động giống như một phương pháp tiêu chuẩn, nhưng để truy cập thông qua "tài sản" nó đột nhiên cư xử khác nhau ...Phương thức mặc định giao diện Java 8 dường như không khai báo thuộc tính
Đây là một trường hợp thử nghiệm:
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
{ }
}
Kết quả:
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)
Câu hỏi: tôi có làm gì sai hoặc là một lỗi trong Java? Có một cách giải quyết khác hơn là không bao giờ sử dụng các phương thức mặc định (cho getters/setters) trong trường hợp bạn có thể cần truy cập chúng như là một "thuộc tính" tại một số điểm sau đó?
Tôi luôn ghét các đặc tính Java "theo quy ước" có xu hướng phá vỡ vì bạn hắt hơi theo cách sai.
Dường như điều này được bao phủ bởi [JDK-8071693] (https://bugs.openjdk.java.net/browse/JDK-8071693), chưa được khắc phục trong bất kỳ bản phát hành JDK nào. –
Vâng, thực sự. Hy vọng họ sửa chữa nó. – doublep
Tôi cũng bị cắn bởi lỗi này. Lỗi OpenJDK được lên kế hoạch cho Java 9 có nghĩa là chúng ta sẽ phải đợi đến ít nhất là tháng 9 năm 2016 để sửa lỗi. Trong thời gian chờ đợi, tôi sẽ chỉ cần tạo một phương thức ủy nhiệm trong lớp cần thuộc tính. –