Это какая-то боль, но вы должны идти в двух измерениях
yourBeanClass.getSuperclass(); (and recursively get all superclasses until Object)
и тогда вы можете получить поля каждого из них
eachClass.getDeclaredFields() NOT getFields so you can get all the private fields
Как только у вас есть каждое поле
field.getType() which returns the Class of that field
тогда, конечно, вам нужно снова пройти по цепочке суперклассов dudes, чтобы убедиться, что вы получите ВСЕ поля класса, включая поля в суперклассе
Когда у вас есть эта цепочка классов для этого поля, вы можете получить ее поля, повторив вышеизложенное .... да, jdk сделал это забавным !!!! Я бы хотел, чтобы у них был метод getAllDeclaredFields, поэтому мне не пришлось подниматься по иерархии суперклассов.
ВАЖНО: вам нужно вызвать field.setAccessible (true), чтобы вы могли читать и писать в него, когда это, кстати, частное поле !!!
Вот код, который получает все поля для класса, включая суперклассы.
private static List<Field> findAllFields(Class<?> metaClass) {
List<Field[]> fields = new ArrayList<Field[]>();
findFields(metaClass, fields);
List<Field> allFields = new ArrayList<Field>();
for(Field[] f : fields) {
List<Field> asList = Arrays.asList(f);
allFields.addAll(asList);
}
return allFields;
}
private static void findFields(Class metaClass2, List<Field[]> fields) {
Class next = metaClass2;
while(true) {
Field[] f = next.getDeclaredFields();
fields.add(f);
next = next.getSuperclass();
if(next.equals(Object.class))
return;
}
}
позже,
Декан