javagetfield获得⽗类字段_Java的getDeclaredField和getF。
。。
终于于于于于休息啦,上来先说结论。
结论:
getDeclaredFields⽅法仅对类本⾝的字段有效果,对于继承的⽗类的字段⽆效
getFields⽅法只能获取类及其⽗类的公共字段
获取⽗类的私有字段需要先使⽤getSuperClass获取⽗类Class,然后通过⽗类Class的getDeclaredFields⽅法获取⽗类的所有字段
下⾯我们举个简单的栗⼦:
这是我们定义的⼀个⽗类,其中定义了⼀个公共字段superDesc,和⼀个私有字段superName
表演的英文public class SuperModel {
private String superName;
public String superDesc;
public String getSuperDesc() {
return superDesc;
}
public void tSuperDesc(String superDesc) {
this.superDesc = superDesc;
}
public String getSuperName() {
return superName;
}
public void tSuperName(String superName) {
this.superName = superName;
}
}
这是我定义的⼀个⼦类,其中也定义了⼀个公共字段modelDesc和⼀个私有字段modelName
public class Model extends SuperModel {
public String modelDesc;
private String modelName;
public String getModelDesc() {
coox
return modelDesc;
}
public void tModelDesc(String modelDesc) {
leha
}
public String getModelName() {
return modelName;
}
public void tModelName(String modelName) {
}
}
下⾯我使⽤了三个测试⽅法来测试。
public class ReflectTest {
public static void main(String[] args) {
Model model = new Model();
model.tSuperDesc("⽗类公开字段");
model.tSuperName("⽗类私有字段");
model.tModelDesc("⼦类公开字段");
model.tModelName("⼦类私有字段");
//通过getFields⽅法遍历字段获取model字段getNameByGetFields(model);
//通过getDeclaredFeilds⽅法获取model字段getNameByDeclaredFields(model);no boundaries
//通过getSuperClass⽅法获取model字段getNameBySuperClass(model);
}
private static void getNameByGetFields(Model model) {
小情歌英文版Class extends Model> sonClass = Class();
try {
Field[] fields = Fields();
System.out.println("通过getFields⽅法遍历字段获取model字段: "); for (Field field : fields) {
System.out.Name() + ":" + (model));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
private static void getNameByDeclaredFields(Model model) { Class extends Model> sonClass = Class();
try {
System.out.println("通过getDeclaredFeilds⽅法获取model字段: "); Field[] fields = DeclaredFields();
look upfor (Field field : fields) {
field.tAccessible(true);
System.out.Name() + ":" + (model));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
private static void getNameBySuperClass(Model model) {
totalClass extends Model> sonClass = Class();
try {
System.out.println("通过getSuperClass⽅法获取superName字段 "); Class> superclass = Superclass();
Field[] fields = DeclaredFields();
for (Field field : fields) {
field.tAccessible(true);
System.out.Name() + ":" + (model));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
ta是什么意思
}
}
当我使⽤getFields⽅法遍历所有字段时,输出了以下信息:
这说明getFileds⽅法只能获取公共字段,但是可以同时获取本⾝和⽗类的公共字段
以下是JDK⽂档中的描述:
当我使⽤getDecleadFields遍历所有字段时,输出了以下信息:
布莱尔演讲
这说明getDecleadFields⽅法只能获取类本⾝的字段,但是不能获取⽗类的字段。
nwiz
以下时JDK⽂档中的描述:
当我使⽤getSuperClass获取⽗类Class后再使⽤⽗类的Class的getDecleadFields⽅法,不出所料,输出的⽗类所有的字段。
这说明要获取⽗类的私有字段必须先获取它的Class对象。⽽要遍历⼀个对象应该出现的所有字段,就需要遍历这个对象和这个对象的⽗类所有字段,不能⼀次性直接获取到所有字段。
最后给个分享个不错的JDK API在线⽂档地址,点过去进⾸页能发现惊喜哦。JDK8中⽂API在线⽂档
Over