List范型使用Java反射Demo
public static <T> T parseXmlNode(T t, Element root) {
Field[] declaredFields = t.getClass().getDeclaredFields();
for (Field field : declaredFields) {
try {
Class<?> type = field.getType();
if(List.class.getTypeName().equals(type.getName())){
//List
List list = new ArrayList<>();
List<Element> parentNodeList = XmlUtil.getElements(root, field.getName());
for (Element parentNode : parentNodeList) {
ParameterizedType listGenericType = (ParameterizedType) field.getGenericType();
Class<T> t1 = (Class<T>) listGenericType.getActualTypeArguments()[0];
T instance = t1.newInstance();
//递归
instance = parseBiXmlNode(instance, parentNode);
list.add(instance);
}
String fieldName = field.getName();
String setMethodName = getFieldSetMethodName(fieldName);
Method method = t.getClass().getMethod(setMethodName, type);
method.invoke(t, list);
} else if (String.class.getName().equals(type.getName())) {
//String
String fieldName = field.getName();
String setMethodName = getFieldSetMethodName(fieldName);
Method method = t.getClass().getMethod(setMethodName, String.class);
method.invoke(t, getXmlNodeValue(root, fieldName));
} else {
Element parentNode = XmlUtil.getElement(root, field.getName());
T t1 = (T) type.newInstance();
t1 = parseBiXmlNode(t1, parentNode);
String fieldName = field.getName();
String setMethodName = getFieldSetMethodName(fieldName);
Method method = t.getClass().getMethod(setMethodName, type);
method.invoke(t, t1);
}
} catch (InstantiationException e) {
log.error("parseXmlNode error, field={}, error={}", field.getName(), e);
} catch (IllegalAccessException e) {
log.error("parseXmlNode error, field={}, error={}", field.getName(), e);
} catch (NoSuchMethodException e) {
log.error("parseXmlNode error, field={}, error={}", field.getName(), e);
} catch (InvocationTargetException e) {
log.error("parseXmlNode error, field={}, error={}", field.getName(), e);
} catch (Exception e) {
log.error("parseXmlNode error, field={}, error={}", field.getName(), e);
}
}
return t;
}