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) {
    }
}
相关推荐
lsx2024064 分钟前
SQL LCASE() 函数详解
开发语言
西岭千秋雪_9 分钟前
MySQL集群搭建
java·数据库·分布式·mysql
4311媒体网10 分钟前
C语言实现简单的二分查找算法
c语言·开发语言·算法
小马爱打代码13 分钟前
Spring AI:文生视频 - wanx2.1-i2v-plus
java·人工智能·spring
华仔啊20 分钟前
RebbitMQ 入门教程看这一篇就够了
java·后端·rabbitmq
象象翔22 分钟前
AI+若依(实战篇)
java·人工智能·spring boot·spring
无限进步_24 分钟前
C语言实现贪吃蛇游戏详解
c语言·开发语言·数据结构·c++·后端·算法·游戏
CHANG_THE_WORLD28 分钟前
C++ vs Python 参数传递方式对比
java·c++·python
talenteddriver28 分钟前
java: 4种API 参数传递方式
java·开发语言
四谎真好看29 分钟前
Java 黑马程序员学习笔记(进阶篇31)
java·笔记·学习·学习笔记