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) {
    }
}
相关推荐
星轨zb几秒前
Spring Data Redis 实战避坑:搞定序列化乱码与 Hash 结构存储
java·redis·spring·lock
吃好睡好便好几秒前
在Matlab中绘制质点运动轨迹图
开发语言·学习·算法·matlab·信息可视化
richard_yuu1 分钟前
C#开发全景概述:从零读懂C#的定位、优势与完整技术体系
开发语言·c#
吴声子夜歌1 分钟前
Java——线程的中断
java·中断
吴声子夜歌1 分钟前
状态机——SpringStateMachine嵌套状态流转
java·状态机·嵌套状态
Jul1en_2 分钟前
【SpringCloud】微服务 Sentinel 详解
java·spring·sentinel
Xin_ye100863 分钟前
C# 零基础到精通教程 - 第十二章:异常处理与调试——让程序更健壮
开发语言·c#
楼田莉子5 分钟前
C#学习之C#入门学习
开发语言·后端·学习·c#
我命由我123455 分钟前
PHP - PHP 简易 Web 服务器、基础接口开发
服务器·开发语言·前端·php·intellij-idea·idea·intellij idea
Reload.6 分钟前
CZ航司,shopping JS逆向 acw_sc__v2
开发语言·javascript·python·网络爬虫·ecmascript