同じことをしようとして、最終的に私は自分のメソッドを書いてしまいました.これはすべてのケースを処理するわけではありません.たとえば、宣言されたフィールドの1つがマップである場合、これは壊れますが、これはほとんどの一般的なオブジェクトでは問題ないようです:
@Override
public Map reflectModelAsMap(Class classType) {
List<Class> mappedTracker = new LinkedList<Class>();
return reflectModelAsMap(classType, mappedTracker);
}
private Map reflectModelAsMap(Class classType, List mappedTracker) {
Map<String, Object> mapModel = new LinkedHashMap<String, Object>();
mappedTracker.add(classType);
Field[] fields = classType.getDeclaredFields();
for (Field field : fields) {
if (mappedTracker.contains(field.getType()))
continue;
if (BeanUtils.isSimpleValueType(field.getType())) {
mapModel.put(field.getName(), field.getType().toString());
} else if (Collection.class.isAssignableFrom(field.getType())) {
Class actualType = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
mapModel.put("Collection", reflectModelAsMap(actualType, mappedTracker));
} else {
mapModel.put(field.getName(), reflectModelAsMap(field.getType(), mappedTracker));
}
}
return mapModel;
}
マッピングされたトラッカーは、Hibernate で関係を処理する方法のためです。それがなければ、親と子の間に際限なく再帰的な関係があります。child.getFather().getFirstChild().getFather().getFirstChild().getFather()...