Javabean Introspector - что в моем списке?

Я использую этот код, чтобы узнать весь список Java в данном классе:

BeanInfo beanInfo = Introspector.getBeanInfo(classx);
PropertyDescriptor[] propertyDescriptors = beanInfo .getPropertyDescriptors();

for (PropertyDescriptor pd : propertyDescriptors) {
    Class<?> ptype = pd.getPropertyType();

    if ((ptype+"").contains("java.util.List")) {
        System.out.println("list class property: " + pd.getName() + ", type=" + ptype); 
    }
}

Это вывод:

class property: value, type=interface java.util.List

Вопрос в том, как узнать, какой тип находится в списке? Для этого примера этот список определен в classx как:

@JsonProperty("value")
private List<Value> value = new ArrayList<Value>();

Как я могу узнать, что список представляет собой список объектов Value? Благодарю.

1 ответ

Вы не можете получить это через самоанализ свойства, из-за типа стирания. Что-нибудь с типом Class не имеет никакой общей информации о параметрах типа (по крайней мере, напрямую, отношения супер-типа делают). Чтобы перейти к объявлениям универсального типа, вы должны иметь возможность доступа java.lang.reflect.Type (из которых Class это одна реализация; но те с общими параметрами GenericType).

Существуют библиотеки, которые позволяют вам полностью разрешать универсальные типы, например, java-classmate. Это даст вам доступ к полностью разрешенной информации типа для Fieldс и Methods, но с этого момента вам нужно будет определить логические свойства Бина. Вероятно, можно объединить их, если хотите, чтобы вы могли использовать Бин-интроспекцию для поиска Methods, затем сопоставьте это с разрешенной информацией java-classmate может предложить.

Другие вопросы по тегам