javabean初始化赋默认值-反射实现一键赋值所有的字段

Java经典综合类编程题 定义一个标准的JavaBean,名叫Person,包含属性name、age。使用反射的方式创建一个实例、调用构造函数初始化name、age,使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。 此题有两个需求: 需求一:定义一个标准的JavaBean,名叫Person,包含属性name、age。 需要定义一个Person类。 需求二:使... 阅读详情

摘要

对接的同学提供一个jar过来,然后里面的bean是4级嵌套,然后也没有个文档。看着这么多的属性心里有点蒙。看惯了swaggger的文档格式,心里在想,有没有一个方式可以实现这个需求。网上找了没有,然后自己动手了。

关键字

反射一键初始化bean、序列化保留多级null

1、问题背景

​ 对接的同学提供一个jar过来,然后里面的bean是4级嵌套,也没有个文档。看着这么多的属性心里有点蒙。看惯了swaggger的文档格式,心里在想,有没有一个方式可以实现这个需求

2、问题本质

  • 把一个bean的结构用json的方式展示出来

3、难点

  • bean的结构是多级的
  • bean中包含自定义类
  • bean中包含静态类、内部类

4、可能的实现方式

4.1、利用三方序列化工具,比如Gson实现
XXXTaskAddInput  xxxTaskAddInput=new XXXTaskAddInput();
Gson gson=new GsonBuilder().serializeNulls().create();
System.out.println(gson.toJson(xxxTaskAddInput));

结果

{
    "groupId": null, 
    "groupName": null, 
    "tasks": null
}

从结果明显可以看出,只是保留了一级的null属性。所以说Gson的serializeNulls这个功能是不满足我的这个需求的。

4.2、专注到初始化话

不难看出问题的本质不是序列化,而在于bean的初始化。因为一级属性都是null。二级属性自然是无法序列化出来的。所以我们的核心是实现变量bean,给所有层级的属性赋值对应类型的默认值就好了。

简单的查了下百度,没有直接可用的,然后就自己动手了。反射是解决这个问题的关键。

5、可复用的工具类

public static void setFeidValueNotNull(Object obj) throws Exception {
        for (Field field : obj.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            if (field.get(obj) == null || field.get(obj).toString().equals("[]")) {
                if (field.getGenericType().toString().equals("class java.lang.String")) {
                    field.set(obj, "");
                } else if (field.getGenericType().toString().equals("class java.lang.Integer")) {
                    field.set(obj, 0);
                } else if (field.getGenericType().toString().equals("class java.lang.Double")) {
                    field.set(obj, 0.0);
                } else if (field.getGenericType().toString().equals("class java.lang.Long")) {
                    field.set(obj, 0L);
                } else {
                    Type type = field.getGenericType();
                    if (List.class.isAssignableFrom(field.getType())) {
                        List arraylist = new ArrayList();
                        // 这样判断type 是不是参数化类型。 如Collection<String>就是一个参数化类型。
                        if (type instanceof ParameterizedType) {
                            // 获取类型的类型参数类型。  你可以去查看jdk帮助文档对ParameterizedType的解释。
                            Class clazz =
                                    (Class) ((ParameterizedType) type).getActualTypeArguments()[0];
                            Object subObject = clazz.newInstance();
                            setFeidValueNotNull(subObject);
                            arraylist.add(subObject);
                        }
                        field.set(obj, arraylist);
                    } else {
                        Class clazz = Class.forName(field.getGenericType().getTypeName());
                        Object subObject = clazz.newInstance();
                        setFeidValueNotNull(subObject);
                        field.set(obj, subObject);
                    }
                }
            }
        }
    }

如何使用

XXXTaskAddInput  xxxTaskAddInput=new XXXTaskAddInput();
setFeidValueNotNull(xxxTaskAddInput);
System.out.println(new Gson().toJson(xxxTaskAddInput));

效果

{
    "groupId": "", 
    "groupName": "", 
    "tasks": [
        {
            "bizId": "", 
            "bizInfo": {
                "receiver": "", 
                "extendInfo": "", 
                "organizationId": "", 
                "exportInfos": [
                    {
                        "columnIndex": 0, 
                        "rowspan": 1, 
                        "columnName": "", 
                        "columnValue": ""
                    }
                ], 
                "result": ""
            }, 
            "name": "", 
            "type": 0, 
            "total": 0, 
            "accountOid": "", 
            "accountGid": "", 
            "receiver": ""
        }
    ]
}

是不是没有想象中复杂,补充一句,swagger中是借助于注解实现的。

6、总结

发现问题,解决问题,总结问题。一步一个脚印的往前走。回头看,其实所谓的困难也没那么难。

最全卷积总结篇(分组、深度可分离、空洞、转置等) 分组卷积(Group Convolution)是一种卷积操作方式,它最早在AlexNet中引入,并在深度学习中被广泛使用,尤其是在高效模型设计(如MobileNet和ResNeXt)中。分组卷积通过将输入特征通道分为若干组,并在每组内单独进行卷积操作,可以减少计算复杂度和参数量,同时有效利用模型的结构特性。分组卷积的工作原理通道分组:输入特征图的通道图为C_in,输出特征图的通道数为C_out,将每组的C_in和C_out分为G组,每组的通道数为C_in/G和C_out/G。组内卷积。 阅读详情

相关推荐

华为昇腾 910B 实战:DeepSeek-R1 蒸馏模型高效部署与性能调优全解析

本文详细解析了在华为昇腾910B硬件平台上高效部署DeepSeek-R1蒸馏系列模型(14B/32B版本)的完整实战流程。内容涵盖从MindIE环境搭建、镜像获取、模型准备,到服务配置、内存参数调优、性能测试及常见问题排查,为开发者提供了基于昇腾910B进行大模型部署与优化的全链路指南。

weixin_28235513的博客 206

【为对象javaBean赋默认值】----java通过反射获取属性字段名、值、数据类型

JavaBean中属性值为null的赋默认值,根据对象的类型不同,分别赋不同的值仅限于当前类,不能给父类设置值参考了博主的方法,自己做了修改,原博主链接:https://blog.csdn.net/qq_25381015/article/details/116198594 方法调用:...

m0_46459413的博客 1858

Spring Boot 实现多图片上传并回显,涨姿势了~

上传 Controller的代码非常简单,由于用了SpringMVC框架,所以直接用MultipartFile来接即可。由于是多图片上传所以用数组来接。此处应该注意参数名应该和<input>中的name值相对应: @RequestMapping("/pic") @ResponseBody publicResponseEntity<String>pic(MultipartFile[]pictures)throwsException{ ResponseEnti...

weixin_54556126的博客 888

java bean 设置初始值_spring注入怎么样设置默认值?

和FactoryBean去定义具体获取方式不同,其实也有Spring提供类似的机制,可以完成这个获取方式,即有自定义的用自定义,没有的话,使用默认的比如:@ConditionalOnMissingBean用@ConditionalOnMissingBean这个注解,你在配置你的默认实现时,给它上面加一个@Bean@ConditionalOnMissingBean(InterceptorPredic...

weixin_39875941的博客 3735

【优化调度】基于混合整数线性规划的电力系统机组组合优化(Matlab实现)

本文详细介绍了基于混合整数线性规划(MILP)的电力系统机组组合优化方法,通过Matlab实现高效调度决策。内容涵盖目标函数构建、约束条件设置及求解器调优,帮助降低发电成本并提升系统稳定性。适用于电力系统调度员和能源优化研究人员,实现从理论到实践的完整解决方案。

weixin_29050271的博客 579

无人机散热系统设计:从材料选择到智能调控的全面解析

本文全面解析无人机散热系统设计,从材料选择到智能调控,探讨了导热界面材料、轻量化散热结构和智能调控算法的应用。通过实战案例,展示了如何在极端环境下优化散热性能,提升无人机的工作效率和可靠性。

weixin_42567279的博客 425

java 同一个事物 先更新再查询_Java框架面试题

Spring Bean作用域区别使用scope指定bean的作用于属性介绍singleton默认值,当IOC容器一创建就会创建bean的实例,是单例的,每次得到的都是同一个propotype原型的,当IOC容器创建时不创建bean,每次调用getBean方法时再实例化bean,而且不是同一个request在web环境中使用,每次HTTP请求实例化一个beansession在web环境中使...

weixin_42347357的博客 4298

【温室气体数据集】全球总碳柱观测网络 TCCON

【温室气体数据集】全球总碳柱观测网络 TCCON

WW、forever的博客 425

Spring干货集|Bean依赖你又觉得行了?

本文深入探讨了Spring框架中的依赖注入(DI)实践,主要包含以下内容: DI原理:通过控制反转(IoC)实现对象依赖关系的自动管理,使代码更整洁解耦,便于测试。 两种主要DI方式: 构造器注入:推荐用于强制性依赖,确保对象完全初始化 setter注入:适用于可选依赖,提供后期配置灵活性 特殊属性应用: depends-on:控制bean初始化/销毁顺序 lazy-init:延迟初始化优化启动性能 最佳实践建议: 强制依赖使用构造器注入 可选依赖使用setter注入 避免过多构造参数,遵循单一职责原则 文

JavaEdge全是干货的技术号 1514

《从底层结构开始学习FPGA》目录与传送门

《从底层结构开始学习FPGA》目录与传送门

孤独的单刀 16万+

微信小程序- 云开发上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。(小程序上传部署云函数提示错误,开发控制台中的云函数没有删除,详细排查)

微信小程序——云函数上传失败,微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。微信小程序上传云函数失败,微信小程序云开发|Error: ResourceNotFound.FunctionName, FunctionName 指定的资源不存在。微信云开发报错(Error: ResourceNotFound.FunctionName,微信小程序云函数报错,上传云函数 sum 失败 Error:,上传部署我们的云函数 2. 报错 错误信息

🏆 前端领域优质创作者 4305

源于项目:通用初始化JavaBean属性类

      在大型项目中,一张数据表可能有100甚至200个字段,对应的javaBean字段也会有这么多,比如我们公司,做银行系统,一张数据表150个字段很正常。在系统中我们需要向数据表写javaBean,比如新增。对于150个字段的javaBean,实际上在业务上处理的可能最多50个字段,但是其它字段在数据库中不允许为空。我们不得不手工调用javaBean的set方法对其它属性给于默认的值比如0

Jarvis_技术专栏 6498

STM32H750VB与AD5292通讯,写入阻值后,AD5292 的阻值没有变化,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1094

利用反射实现javaBean自动赋值

Field[] fields = normOrgDict.getClass().getDeclaredFields(); for (int i =0; i < fields.length; i++){ try { fields[i].setAccessible(true); Object ...

tian895623的博客 398

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java反射 初始化bean_通用javabean初始化(反射机制)

主要看点:1. 反射机制的使用解决所有field都可赋值。 fields[i].setAccessible(true);2. 赋值方法类型识别及赋值。instanceof,fields[i].getType().getName()和set(instance,value)3. 数组对象赋值对field是数组的处理。Array.set(fieldval,0,newInstance(clazz2));源...

weixin_31849265的博客 240

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

通用javabean初始化(反射机制)

<br />主要看点:<br />1. 反射机制的使用<br />   解决所有field都可赋值。 fields[i].setAccessible(true);<br />2. 赋值方法<br />    类型识别及赋值。instanceof,fields[i].getType().getName()和set(instance,value)<br />3. 数组对象赋值<br />    对field是数组的处理。Array.set(fieldval,0,newInstance(clazz2));<br

xiaoran27的专栏 846

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

使用反射机制对类字段进行选择性校验(java反射二)

这是一个使用java反射机制对类字段进行校验的工具,在工厂类中定义map存储需要校验的类类型和该类中需要校验的字段,在校验类中使用反射获取相关类的字段并进行校验,多用于接口开发时对字段的校验。 1、定义三个常用类用于测试 package validation; //测试用的动物类 public class Animal {  private String animalName;  pr

好习惯要坚持下去 1970

反射javabean

package question2; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /* * 定义一个标准的JavaBean,名叫Person,包含属性name、age。 * 使用反射的方式创建一个实例、调用构造函数初始化name、

学海无涯 502

Java研学-反射与内省

通过指定类的字节码文件获取对应的字节码对象;通过该对象调用类中的成员。

zhlyxx的博客 843

MyBatis源码实现之反射工具箱之Reflector&ReflectorFactory

反射工具箱之Reflector&ReflectorFactory MyBatis在进行参数处理、结果映射等操作时,会涉及大量的反射操作。Java 中的反射虽 然功能强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis 提供了专门的反射模块,该模块位于org.apache.ibatis.reflection 包中,它对常见的反射操作做了 进一步封装,提供了更加...

瘦子没有夏天 1548

Mybatis 源码学习(2)-反射工具(Reflector)

由于 JDK 提供的反射机制过于复杂,因此 Mybatis 对常用的反射机制做了封装,以简化反射 API,这部分封装代码在 org.apache.ibatis.reflection 包中。 Reflector Reflector 主要用于解析一个 Class 对象,将其类型、构造函数、set方法、get 方法做解析,方便随时使用。 这里的 get/set 方法解析,只根据方法进行解析,而不关系其中...

teaandnoodle的专栏 423

反射和javaBean的练习

public class Test { /**编写一个类,增加一个实例方法用于打印一条字符串。 * 并使用反射手段创建该类的对象, 并调用该对象中的方法。 * @param args * @throws ClassNotFoundException * @throws NoSuchMethodException * @throws S

六道对穿肠的学习之旅 1538

反射

1. 概述 反射就是把java类中的各种成分映射成相应的java类。 1.1 类的加载概述 当程序要使用某个类的时候,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类进行初始化 1.1.1 加载 就是指将class文件读入内存,并为之创建一个Class对象,任何类被使用的时候,系统都会建立一个Class对象 1.1.2 连接 连接分为三步: 1. 验证:...

武汉小喽啰 294

Gson的反射解析机制详解(2)

Gson反射即系机制详解

菜鸟博客 4858

JavaBean属性操作复习

以下笔记是根据张孝祥的视频整理而成!

hyz_116的专栏 1173

javabean反射改字段内容_BAT程序员编写:深入理解 Java 反射和动态代理源码分析...

什么是反射反射(Reflection)是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。通过反射机制,可以在运行时访问 Java 对象的属性,方法,构造方法等。反射的应用场景反射的主要应用场景有:开发通用框架 - 反射最重要的用途就是开发各种通用框架。很多框架(比如 Spring)都是配置化的(比如通过 XML 文件配置 JavaB...

weixin_42371574的博客 108
上一篇: druid连接泄露故障分析
下一篇: idea编译报错-代码没问题IDEA编译不通过的终极解决方案
人工博客
博客等级 码龄17年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值