通过反射拿到某个类以及其所有父类的信息思路
1.简介:
在日常开发中可能会遇到需要将当前的类的对象的父类及其父类的父类的信息导出使用,我们可以用反射去实现。
2.代码思路:
public static void show(Object a) {
//拿到a的反射类
Class clazz = a.getClass();
//拿到a的所有父类信息,判断指标,当父类是object时
while (clazz.getSuperclass() != Object.class) {
try {
//拿到每一代父类的信息
clazz = clazz.getSuperclass();
//拿到当前父类的属性名
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields
) {
//打开私有访问权限
f.setAccessible(true);
System.out.println("父类的属性名:" + f.getName() + ";属性值:" + f.get(a));
}
} catch (Exception e) {
e.getMessage();
}
}
}
其他相关测试代码:
public class Aentity extends SuperAentity implements Serializable {
private static final long serialVersionUID=1L;
@JsonProperty(value = "name")
private String nameA;
@JsonProperty(value = "age")
private Integer ageA;
@Property(name = "11111")
private String addressA;
public String getNameA() {
return nameA;
}
public void setNameA(String nameA) {
this.nameA = nameA;
}
public Integer getAgeA() {
return ageA;
}
public void setAgeA(Integer ageA) {
this.ageA = ageA;
}
public String getAddressA() {
return addressA;
}
public void setAddressA(String addressA) {
this.addressA = addressA;
}
}
//
public class SuperAentity extends SuperSuperentity implements Serializable {
private static final long serialVersionUID=1L;
public String nameF="我是父类的name名字";
private Integer ageF=18;
public String getNameF() {
return nameF;
}
public void setNameF(String nameF) {
this.nameF = nameF;
}
public Integer getAgeF() {
return ageF;
}
public void setAgeF(Integer ageF) {
this.ageF = ageF;
}
}
///
public class SuperSuperentity implements Serializable {
private static final long serialVersionUID=1L;
private String nameSuper="我是超级父类";
}
测试代码:
public class Test1 {
public static void main(String[] args) {
Aentity aentity=new Aentity();
// Bentity bentity=new Bentity();
aentity.setNameA("aaa");
aentity.setAgeA(16);
aentity.setAddressA("这是a的地址");
// bentity.setNameB("bbb");
// bentity.setAddressB("这是b的地址");
// bentity.setAgeB(17);
// bentity.setEmail("1234567890");
Test1.show(aentity);
}
public static void show(Object a) {
//拿到a的反射类
Class clazz = a.getClass();
//拿到a的所有父类信息,判断指标,当父类是object时
while (clazz.getSuperclass() != Object.class) {
try {
//拿到每一代父类的信息
clazz = clazz.getSuperclass();
//拿到当前父类的属性名
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields
) {
//打开私有访问权限
f.setAccessible(true);
System.out.println("父类的属性名:" + f.getName() + ";属性值:" + f.get(a));
}
} catch (Exception e) {
e.getMessage();
}
}
}
}
测试结果:
3.总结:这个代码中最精华的地方就是判断找到所有父类的指标:所有的类的最终父类都是Object类!,真的,Java的这个设置太巧妙了!!!我之前一直卡在找不到判断找到所有父类的指标,无法控制他的遍历解析次数