获取类的属性有getFields和getDeclaredFields两个方法,简要说下两者区别:
getFields 可以获取当前类及父类的所有public 属性,protect和private无法获取
getDeclaredFields 可以获取到当前类所有的public、protect、private属性
所以,要实现此功能只能使用getDeclaredFields。
当前类取完了,再class.getSuperclass找到父类,完了再爷爷类……
Java
public void printAllMembers(Object obj){
Class cls = obj.getClass();
while (cls != null && cls != Object.class){
Field[] fields = cls.getDeclaredFields();
for (Field fd : fields) {
if (!fd.isAccessible()) {
fd.setAccessible(true);
}
try {
Log.d("bg", fd.getName() + ": " + fd.get(obj));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
cls = cls.getSuperclass();
}
Log.d("bg", "=====the end=====");
}
由于private不允许直接访问,需要调下setAccessible,否则会报错Method threw 'java.lang.IllegalAccessException' exception.
发表评论