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) {
    }
}
相关推荐
此生决int2 分钟前
深入理解C++系列(02)——类和对象(上)
开发语言·c++
咖啡八杯15 分钟前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
要开心吖ZSH2 小时前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
-银雾鸢尾-5 小时前
C#中的拓展方法
开发语言·c#
guodingdingh7 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯9 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育9 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵9 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel11 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel