Java之反射获取和赋值字段

在Java中,反射能够使得代码更加通用,往往用于工具类中。

但常常我们在获取或者赋值反射的属性时,会出现没有赋值成功的结果,往往是由于这个属性在父级中而导致的,这个时候我们就不能用getDeclaredField方法单独获取字段,而是循环遍历所有的父级取字段。

下面提供获取所有属性方法(包括父级):

java 复制代码
/**
 * description: 从当前以及父类中获取全部字段
 *
 * @param clazz 属性所在类
 * @return java.lang.reflect.Field
 */
public static List<Field> getFieldByCurrentAndSuper(Class<?> clazz) {
    List<Field> fields = new ArrayList<>();
    getFieldByCurrentAndSuper(clazz, fields);
    return fields;
}

/**
 * description: 从当前以及父类中获取全部字段
 *
 * @param clazz 属性所在类
 * @return java.lang.reflect.Field
 */
private static List<Field> getFieldByCurrentAndSuper(Class<?> clazz, List<Field> fields) {
    Field[] declaredFields = clazz.getDeclaredFields();
    fields.addAll(Arrays.asList(declaredFields));
    if (!clazz.equals(Object.class)) {
        return getFieldByCurrentAndSuper(clazz.getSuperclass(), fields);
    }
    return fields;
}

我们拿到泛型的Class后,就可以直接调用getFieldByCurrentAndSuper方法来获取所有属性,然后遍历对属性操作,如下:

java 复制代码
/**
 * 深度赋值属性
 */
private static void setField(Class<?> clazz, String userTenantCode, Object arg) throws IllegalAccessException {
    try {
        List<Field> fieldList = getFieldByCurrentAndSuper(clazz);
        if (fieldList.size() > 0) {
            for (Field field : fieldList) {
                if (field.getName().equals("tenantCode")) {
                    // 设置可访问私有属性
                    field.setAccessible(true);
                    field.set(arg, userTenantCode);
                }
            }
        }
    } catch (Exception ignored) {
    }
}
相关推荐
StevenLdh10 分钟前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
逐光者93312 分钟前
滤波器的 R 与 C 如何选择:从截止频率到工程实践
c语言·开发语言·r语言
Eider199817 分钟前
大模型输出格式幻觉解决思路
开发语言·前端·javascript
Wang's Blog18 分钟前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务消费者
java·dubbo·交友
IT研究室25 分钟前
最新计算机毕业设计选题推荐-基于spring boot的教育学习平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
亚林瓜子28 分钟前
Spring Boot 集成 ip2region 离线 IP 库实战指南
java·spring boot·后端·ip·ip2region
Want59536 分钟前
Python太极八卦图
开发语言·python
饕餮争锋1 小时前
python开发工具uv简介
开发语言·python·uv
盛世宏博智慧档案1 小时前
恒湿净化一体机联动开发:档案馆温湿度阈值判断与启停控制实践
java·后端·struts·恒湿机·加湿除湿消毒净化一体机
奇树谦1 小时前
LRU 缓存原理与 C++ 实践示例
开发语言·c++·缓存