Java反射 getFields和 getDeclaredFields 方法的区别
一、前言
Java反射中,获取一个类中的属性(字段),有2种方法分别是:getFields和 getDeclaredFields , 这2个方法后者比前者多了一个 Declared ,那么这2个方法有啥区别呢?
二、结论
1、getFields:获取当前类或父类或父接口的 public 修饰的字段。
2、getDeclaredFields:获取当前类的所有字段,包括 protected/默认/private 修饰的字段;不包括父类public 修饰的字段。
三、代码验证
1、创建一个 ReflectService 接口,里面有一个字段:
public interface ReflectService {
String FACE = "face";
}
2、创建一个 Parent 类,有四种java权限修饰符修饰的字段 (以 11 结尾):
public class Parent {
public int id11 ;
protected int num11;
String name11;
private String addr11;
}
3、创建一个Child类,实现 ReflectService 接口,继承Parent类,同时有四种java权限修饰符修饰的字段 (以 22 结尾):
public abstract class Child extends Parent implements ReflectService {
public int id22 ;
protected int num22 ;
String name22 ;
private String addr22;
}
4.1、测试 getFields 方法:
@Test
public void test1(){
Class<Child> childClass = Child.class;
Field[] fields = childClass.getFields();
for (Field e : fields) {
System.out.println(e.getName());
}
}
4.2、输出结果如下:
id22
FACE
id11
5.1、getDeclaredFields 测试 方法:
@Test
public void test2(){
Class<Child> childClass = Child.class;
Field[] fields = childClass.getDeclaredFields();
for (Field e : fields) {
System.out.println(e.getName());
}
}
5.2、输出结果如下:
id22
num22
name22
addr22
四、总结
1、getFields方法的输出结果:当前类和父类、实现接口里的字段 ,说明结论【二-1】成立。
2、注意:接口中的字段,都是 public static final 修饰的,可以通过 反编译 或 字段前 private 修饰,看报错信息进行验证。
3、getDeclaredFields方法输出结果:当前类的全部字段,说明结论【二-2】成立。
关联学习:Java反射 getMethods 和 getDeclaredMethods 方法的区别_HaHa_Sir的博客-CSDN博客