Метод по умолчанию интерфейса Java 8, похоже, не объявляет свойствоJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Метод по умолчанию интерфейса Java 8, похоже, не объявляет свойство

Сообщение Anonymous »

В моем приложении я столкнулся с проблемой: когда геттер в классе используется по умолчанию только в интерфейсе (функция 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? Есть ли обходной путь, кроме никогда не использовать методы по умолчанию (для геттеров/сеттеров) на случай, если в какой-то момент вам может понадобиться доступ к ним как к «свойству»?

< em>Я всегда ненавидел «свойства по соглашению» Java, которые имеют тенденцию нарушаться, потому что вы чихаете неправильно.

Подробнее здесь: https://stackoverflow.com/questions/317 ... e-property
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»