反射獲取本類和父類所有屬性
-
getFields():獲得某個類的所有的公共(public)的字段,包括父類中的字段。
-
getDeclaredFields():獲得某個類的所有聲明的字段,即包括public、private和proteced,但是不包括父類的申明字段。
-
同樣類似的還有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods(),這兩者分別表示獲取某個類的方法、構造函數。
那么問題來了,我要獲取到當前類以及父類的所有屬性,怎么辦?
/**
* 獲取本類及其父類的屬性的方法
* @param clazz 當前類對象
* @return 字段數組
*/
private static Field[] getAllFields(Class<?> clazz) {
List<Field> fieldList = new ArrayList<>();
while (clazz != null){
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
return fieldList.toArray(fields);
}
測試:
public static void main(String[] args) {
Student student = new Student();
student.setStuClass("18001");
student.setStuNum("19800101");
student.setName("Tom");
student.setAge("20");
Class<? extends Student> clazz = student.getClass();
Field[] fields = getAllFields(clazz);
for (Field field : fields) {
System.out.println(field.getName());
}
}