网站首页 > java教程 正文
Java中的反射在Spring这些框架中应用的很频繁,比如Spring容器初始化Bean的过程等等,但是在实际的业务开发中自己却应用的很少。
最近的开发过程中正好有个这样的需求,有几个实体类中属性比较多,而且这些属性都是定义的返回金额字断,因为金额在计算过程中可能出现精度问题,所以定义金额字断属性都使用的BigDecimal进行修饰。在和前端对接的过程中发现有些金额字断返回的NULL,这样就产生了一些歧义,因为NULL和0并不是一码事,需要后端给出清晰返回,这个问题处理起来并不复杂,下面整理了几种处理方案:
- 修改查询sql,查询时NULL的属性使用IFNULL函数转为0;
- 在属性的setXxx方法时统一判断一下如果set值为NULL则转换为返回BigDecimal.ZERO;
- 在属性上增加注解,返回实体信息时统一使用反射进行属性转换;
因为返回实体属性较多,第3种方案明显要优于第2种,这样不用大面积做属性转换,代码也更加简洁。相对于第3种方案来说,第1种需要重写sql,改动则较多。下面是具体实现方法:
1.定义注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface IsNullConvertZero {
}
2.定义校验实体Util类
@Slf4j
public class IsNullConvertZeroUtil {
public static Object checkIsNull(Object obj) {
try {
Class<?> clazz = obj.getClass();
//获得私有的成员属性
Field[] fields = clazz.getDeclaredFields();
if(Objects.nonNull(fields) && fields.length>0){
for(Field field : fields){
field.setAccessible(true);
//判断IsNullConvertZero注解是否存在
if(field.isAnnotationPresent(IsNullConvertZero.class)){
if(Objects.isNull(field.get(obj))){
field.set(obj, BigDecimal.ZERO);
}
}
}
}
} catch (Exception e) {
log.error("IsNullConvertZeroUtil出现异常:{}",e);
}
return obj;
}
}
3.定义返回实体类
@Data
@ToString
public class ServcenterAccountDTO {
@IsNullConvertZero
private BigDecimal businessPaymentBeginBalance;
@IsNullConvertZero
private BigDecimal businessReceiptTodayAmount;
@IsNullConvertZero
private BigDecimal businessRefundTodayAmount;
@IsNullConvertZero
private BigDecimal tempReserveBeginBalance;
/**
* 还有很多属性,就不罗列了
*/
}
4.使用示例
ServcenterAccountDTO servcenterAccountDTO = new ServcenterAccountDTO();
servcenterAccountDTO.setBusinessPaymentBeginBalance(businessPaymentBeginBalance);
servcenterAccountDTO.setBusinessReceiptTodayAmount(businessReceiptTodayAmount);
servcenterAccountDTO.setBusinessRefundTodayAmount(businessRefundTodayAmount);
servcenterAccountDTO.setTempReserveBeginBalance(tempReserveBeginBalance);
/**
* 还有很多属性,就不罗列了
*/
//通过反射校验注解将属性值NULL转为BigDecimal.ZERO
IsNullConvertZeroUtil.checkIsNull(servcenterAccountDTO);
return servcenterAccountDTO;
以上就是反射和自定义注解的一个简单应用。
不断分享开发过程用到的技术和面试经常被问到的问题,如果您也对IT技术比较感兴趣可以「关注」我
猜你喜欢
- 2024-09-27 在Spring Boot项目中创建和使用自定义注解
- 2024-09-27 这一篇 Java 注解,写得太好了(java注解使用)
- 2024-09-27 学习廖雪峰的JAVA教程---注解(定义注解@interface)
- 2024-09-27 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?
- 2024-09-27 Spring Boot 整合mybatis,使用注解的方式(自动生成注解)
- 2024-09-27 面试官:实际工作中哪里用到了自定义注解?
- 2024-09-27 使用自定义注解和切面AOP实现Java程序增强
- 2024-09-27 Java-注解有什么用?该怎么用?(java 注解的作用)
- 2024-09-27 Java 17中的元注解:自定义注解的行为
- 2024-09-27 自定义注解你真会用吗?(说说自定义注解的场景及实现)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)