Этот вопрос кажется неудобным, но мы сталкиваемся с странным поведением при извлечении PropertyDescriptors javabean. Вот результаты выполнения 1,6, 1,7 и 1,8 простой части кода, составленной с соблюдением 1.6.Является ли JRE 1.8 еще спецификациями JavaBean совместимыми с IndexedPropertyDescriptor?
Java 1.6 выполнение:
< [email protected] - Не важно [email protected] < - Да у меня есть индексированный свойство
Java 1.7 Выполнение:
java.beans.PropertyDescriptor [name = class; propertyType = class java.lang.Class; readMethod = public final native java.lang.Class java.lang.Object.getClass()] < - не важно java.beans.IndexedPropertyDescriptor [name = values; indexedPropertyType = класс java.lang.String; indexedReadMethod = java.lang.String JavaBean.getValues общественного (интермедиат)] < - Да у меня есть индексированное свойство
Java 1.8 Исполнение:
java.beans.PropertyDescriptor [имя = класс; propertyType = class java.lang.Class; readMethod = public final native java.lang.Class java.lang.Object.getClass()] < - Не важно java.beans.PropertyDescriptor [name = values; propertyType = interface java.util.List; readMethod = public java.util.List JavaBean.getValues ()] < - Ой! Это уже не индексированное свойство!
Почему это изменилось?
В javabean specs говорится о доступе к объекту с индексом. Не считается обязательным использовать массив в качестве контейнера с индексированным свойством. Я ошибаюсь?
Я прочитал спецификации и главу 8.3.3, рассказывая о шаблонах проектирования для индексированных свойств, а не о строгом правиле.
Как вернуть предыдущее поведение снова без рефакторинга всего приложения? < Старое приложение, много коды для изменения и т.д. ...
Спасибо за ответы,
JavaBean класса
import java.util.ArrayList;
import java.util.List;
public class JavaBean {
private List<String> values = new ArrayList<String>();
public String getValues(int index) {
return this.values.get(index);
}
public List<String> getValues() {
return this.values;
}
}
Основного класс
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class Test {
public static void main(String[] args) throws IntrospectionException {
PropertyDescriptor[] descs =
Introspector.getBeanInfo(JavaBean.class).getPropertyDescriptors();
for (PropertyDescriptor pd : descs) {
System.out.println(pd);
}
}
}
Ну ... Я ожидал такого ответа. Я до сих пор не понимаю, почему поведение изменилось таким образом, к более ограничительной реализации. Отличный ответ. Благодарю. Поскольку мы используем commons-beanutils, я предпочитаю расширять возможности этого API, используя BeanIntrospector, который может обнаружить IndexedProperty в моем собственном определении во время изучения компонента. –