java反射getDeclaredFields/getDeclaredField与getFields/getField的区别

结论:

getDeclaredField(s)与getField(s)的主要区别在于对父子类字段及不同访问权限修饰的字段的获取上.

  1. getDeclaredFields / getDeclaredField :
    (1) 能获取到本类的所有字段(包括 private, default, protected, public ), 不能获取到父类的任何字段
    (2) 在(1)的基础上, 该字段可以是同时被 static, final, volatile, transient 中的一种或几种修饰

  2. getFields / getField :
    (1) 能且仅能获取到本类及所有父类/超类中 public 权限的字段
    (2) 在(1)的基础上, 该字段可以是同时被 static, final, volatile, transient 中的一种或几种修饰

示例:

/**
 * 父类
 */
public class SuperObject {
    private int superA;
    int superB;
    protected int superC;
    public int superD;
}

/**
 * 本类
 */
public class SubObject extends SuperObject {
    private int subA;
    int subB;
    protected int subC;
    public int subD;
}

/**
 * 测试打印
 */
public static void main(String[] args) throws NoSuchFieldException {
	Field[] declaredFields = SubObject.class.getDeclaredFields();
	Arrays.stream(declaredFields).forEach(System.out::println);
    System.out.println("----------");
    Field[] fields = SubObject.class.getFields();
    Arrays.stream(fields).forEach(System.out::println);
}

打印结果:

private int com.test.SubObject.subA
int com.test.SubObject.subB
protected int com.test.SubObject.subC
public int com.test.SubObject.subD
----------
public int com.test.SubObject.subD
public int com.test.SuperObject.superD

扩展:

如何获取本类(private, default, protected, public)及父类/超类(private, default, protected, public)的所有字段? 可自定义如下方法:

/**
 * 反射获取本类及所有父类的字段(包含所有权限)
 */
public static List<Field> getAllFields(Class<?> clazz) {
	List<Field> fieldList = new ArrayList<>();
    while (clazz != null) {
    	fieldList.addAll(Arrays.stream(clazz.getDeclaredFields()).collect(Collectors.toList()));
		clazz = clazz.getSuperclass();
	}
	return fieldList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值