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
с и Method
s, но с этого момента вам нужно будет определить логические свойства Бина. Вероятно, можно объединить их, если хотите, чтобы вы могли использовать Бин-интроспекцию для поиска Method
s, затем сопоставьте это с разрешенной информацией java-classmate
может предложить.