private static void addDeclaredAndInheritedFields(Class<?> c, Collection<Field> fields) {
fields.addAll(Arrays.asList(c.getDeclaredFields()));
Class<?> superClass = c.getSuperclass();
if (superClass != null) {
addDeclaredAndInheritedFields(superClass, fields);
}
}
이 유일한 작은 문제가있다 그들은 선언되고 상속 된 멤버들의 수퍼 셋을 반환한다. getDeclaredFields() 메서드는 private 메서드도 반환합니다. 따라서 전체 수퍼 클래스 계층 구조를 탐색하면 수퍼 클래스에 선언 된 모든 개인 필드가 포함되며 상속받지 않습니다.
Modifier.isPublic을 사용하는 간단한 필터 || Modifier.isProtected 술어는 할 것 :
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isProtected;
(...)
List<Field> inheritableFields = new ArrayList<Field>();
for (Field field : type.getDeclaredFields()) {
if (isProtected(field.getModifiers()) || isPublic(field.getModifiers())) {
inheritableFields.add(field);
}
}
예. 그 생각. 다른 방법이 있는지 확인하고 싶었습니다. 감사. :) – Veera
그것이 효과가있다. 감사. – Veera
변경 가능한 인수를 전달한 후 반환하는 것은 좋지 않습니다. fields.addAll (type.getDeclaredFields()); add를 사용하여 for 루프를 개선하는 것보다 더 일반적입니다. –