java 反射获取含有某个属性字段的类(包括父类,父类的父类),由于反射只能获取当前类的全部属性字段,当前类不能获取继承自父类的属性字段,所以要想获取有继承关系的类的全部字段就需要递归获取父类进行判断,这样才能找到属性字段所在的类,是当前类还是它的父类,父父类,父父父类......
这里封装成了两个静态方法
public static Class getClass(Class c, String fieldName) {
if (c !=null && !hasField(c, fieldName)) {
return getClass(c.getSuperclass(), fieldName);
}
return c;
}
public static boolean hasField(Class c, String fieldName){
Field[] fields = c.getDeclaredFields();
for (Field f : fields) {
if (fieldName.equals(f.getName())) {
return true;
}
}
return false;
}
测试代码
User 实体类
package com.tdemo.fanshe;
import lombok.Data;
@Data
public class User {
private String name;
private Integer age;
}
GeneralUser 继承 User
package com.tdemo.fanshe;
import lombok.Data;
@Data
public class GeneralUser extends User{
private String userCode;
private String password;
}
SuperUser 继承 GeneralUser
package com.tdemo.fanshe;
import lombok.Data;
@Data
public class SuperUser extends GeneralUser{
private String role;
}
测试
package com.tdemo.fanshe;
import java.lang.reflect.Field;
public class UserMain {
public static void main(String[] args) {
SuperUser superUser = new SuperUser();
System.out.println(getClass(superUser.getClass(), "role"));
System.out.println(getClass(superUser.getClass(), "password"));
System.out.println(getClass(superUser.getClass(), "name"));
}
public static Class getClass(Class c, String fieldName) {
if (c !=null && !hasField(c, fieldName)) {
return getClass(c.getSuperclass(), fieldName);
}
return c;
}
public static boolean hasField(Class c, String fieldName){
Field[] fields = c.getDeclaredFields();
for (Field f : fields) {
if (fieldName.equals(f.getName())) {
return true;
}
}
return false;
}
}
运行效果
至此完