自定义注解+反射提取对象到map中
一、问题:有时候我们与第三方接口对接传参时,需要将对象里的字段和值以map形式传给别人,此时可以借助其他的工具类,但是我个人用起来不太灵活,还会把多余的字段传给别人,因此我们自己动手搞一套
二、思路:
1.别人的字段定义和我们定义的名称可能不一样,字段名称需要能够自定义;
2.要能够忽略对象里面的字段;
3.要能支持对字段做简单的非空校验;
4.复杂的pojo需要递归,这里只考虑简单的pojo对象。
三、步骤:
1.定义字段的注解
/**
* 字段转化适配
*
* @author xuzhangxing
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldMask {
// 指定新的字段名,如果不指定就取原字段名
String value() default "";
// 是否忽视这个字段
boolean ignore() default false;
// 字段为空时是否仍然需要放入map中,默认是不放入
boolean nullIgnore() default false;
// 是否必传,如果设置true 值为null时会抛出异常
boolean required() default false;
}
2.通过反射转成map
import java.lang.reflect.Field;
import java.util.*;
/**
* 字段转map 且能够自定义字段名称或者直接忽视该字段
*
* @author xuzhangxing
*/
public final class ParamMapUtil {
public static List<Field> getAllFields(Class<?> cls) {
final List<Field> allFields = new ArrayList<>();
Class<?> currentClass = cls;
while (currentClass != null) {
final Field[] declaredFields = currentClass.getDeclaredFields();
Collections.addAll(allFields, declaredFields);
currentClass = currentClass.getSuperclass();
}
return allFields;
}
public static Map<String, Object> generateMap(Object target) {
Map<String, Object> result = new HashMap<>();
if (target == null) {
return result;
}
List<Field> allFields = getAllFields(target.getClass());
for (Field field : allFields) {
Object fieldObj;
field.setAccessible(Boolean.TRUE);
try {
fieldObj = field.get(target);
} catch (IllegalAccessException e) {
throw new RuntimeException("ParamMapUtil 获取field 值异常-->" + e.getMessage());
} finally {
field.setAccessible(Boolean.FALSE);
}
FieldMask[] fieldMasks = field.getAnnotationsByType(FieldMask.class);
if (fieldMasks.length > 0) {
FieldMask fieldMask = fieldMasks[0];
if (fieldMask.ignore()) {
continue;
}
// 如果需要非空校验且该字段为空时,抛出异常
if (fieldMask.required() && fieldObj == null) {
throw new RuntimeException("参数" + field.getName() + "必填");
}
// 字段为空时,是否还放入map中
if (fieldObj == null && fieldMask.nullIgnore()) {
continue;
}
// 是否重命名了
String fieldName = fieldMask.value();
if (fieldName == null || fieldName.length() < 1) {
result.put(field.getName(), fieldObj);
} else {
result.put(fieldName, fieldObj);
}
} else {
// 默认所有字段都加进去,需要忽略字段时,标注FieldMask注解且ignore设置成true
result.put(field.getName(), fieldObj);
}
}
return result;
}
}
三、测试
1 pojo
/**
* @author xuzhangxing
*/
public class UserDTO {
@FieldMask("Name")
private String name;
@FieldMask(required = true)
private String age;
@FieldMask(nullIgnore = true)
private String height;
private String email;
@FieldMask(ignore = true)
private String password; // ...geter setter
}
2. 方法调用:
public static void main(String[] args) {
UserDTO userDTO = new UserDTO();
userDTO.setName("xzx");
userDTO.setAge("12");
userDTO.setEmail("123@qq.com");
userDTO.setPassword("123456");
Map<String, Object> generateMap = ParamMapUtil.generateMap(userDTO);
System.out.println(generateMap);
}
3.结果:
{age=12, email=123@qq.com, Name=xzx}
四、总结
1、map中的字段可以通过注解控制字段是否重命名,字段是否直接忽略,字段为空是否抛出异常,字段为空是否不放入map
2、注意如果不标注注解,默认是放入map中
自定义注解+反射提取对象到map中的更多相关文章
- 利用反射跟自定义注解拼接实体对象的查询SQL
前言 项目中虽然有ORM映射框架来帮我们拼写SQL,简化开发过程,降低开发难度.但难免会出现需要自己拼写SQL的情况,这里分享一个利用反射跟自定义注解拼接实体对象的查询SQL的方法. 代码 自定义注解 ...
- Java 自定义注解实现ORM对象关系映射
一,ORM概念 ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关 ...
- 通过自定义注解反射生成SQL语句
----------------------------------------Program.cs---------------------------------------- using Sys ...
- C# - 通过自定义注解反射生成SQL语句[转]
转自http://blog.163.com/jong_cai/blog/static/87028045200902033553581/ -------------------------------- ...
- list中的对象或者map中的版本号排序 version排序
经常会用到版本号排序,直接把他封装成一个工具用起来比较方便. List<A> aList = new ArrayList<>(); ...aList 赋值 ... Collec ...
- 170313、poi:采用自定义注解的方式导入、导出excel(这种方式比较好扩展)
步骤一.自定义注解 步骤二.写Excel泛型工具类 步骤三.在需要导出excel的类属相上加上自定义注解,并设置 步骤四.写service,controller 步骤一:自定义注解 import ja ...
- SpringAOP的自定义注解实践
springaop属于spring的重要属性,在java中有相当广泛的用途,大家一般都接触过aop实现事务的管理,在xml里配好声明式事务,然后直接在service上直接加上相应注解即可, 今天我们来 ...
- ArcGIS Engine中如何获取Map中已经选择的要素呢
1.使用IEnumFeturea对象获取map中的FeatureSelection,该方法可以获取所有图层的选择要素.IMap中的FeatureSelection可不是IFeatureSelectio ...
- Map接口----Map中嵌套Map
package cn.good.com; import java.util.HashMap; import java.util.Iterator; import java.util.Map; impo ...
- ArcGIS Engine中如何获取Map中已经选择的要素呢(转)
ArcGIS Engine中如何获取Map中已经选择的要素呢 1.使用IEnumFeturea对象获取map中的FeatureSelection,该方法可以获取所有图层的选择要素.IMap中的Fe ...
随机推荐
- js-工具方法(持续更新)
/* * @Author: lingxie * @Date: 2020-06-04 13:57:07 * @Descripttion: */ // 是否邮箱 export const isEmail ...
- NSIS 制作漂亮的安装界面(仿QQ音乐,网易云音乐)
废话少说,先上图: 注:下面的录制的安装过程使用的安装包,均为制作的安装包,而非官方源包. QQ音乐的安装过程:
- SAP 采购订单行项目客制化字段增强
需求: 在采购订单行项目中新增客制化字段,区分采购的项目中的物料是量产还是研发物料 开发步骤 主要使用二代增强出口:MM06E005 创建增强项目 事务码T-code:CMOD 创建项目ZEMM001 ...
- 回归分析 3.X 多元线性回归
多元线性回归模型 参数估计 模型表示 我们先将模型 \[y_{i}=\beta_{0}+\beta_{1} x_{i 1}+\cdots+\beta_{p} x_{i k}+\epsilon_{i}, ...
- nodejs web学习
命令行 和python一样,出奇的简单 npm i serve -g serve -s softwares 如果当前目录,就直接 serve express /** * 服务器代码 * 启动方式: * ...
- 报错信息;Cannot execute request on any known server 解决;sprigcloud;跑本地但是服务一直在eureka
配置文件加上: eureka.client.register-with-eureka=falseeureka.client.fetch-registry=false
- PID名词解析
在工程实际中,应用最为广泛的调节器控制规律为比例.积分.微分控制,简称PID控制,又称PID调节. 当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的 其它技术难以采用时,系统控 ...
- 集成mupdf实现手写笔签批应用
1. 首先,需要在Android Studio中集成mupdf,使用Android Studio的Gradle构建系统,可以在dependencies中添加如下依赖: implementation ' ...
- driver报错
self.driver = webdriver.Chrome(),突然报错,运行不了 解决办法: 第一步:去检查你以安装的驱动版本,用cmd打开命令提示符:然后用命令:chromedriver 第二步 ...
- vue3使用echarts插件并实现点击下载图表功能
接到一个新的需求,就是用vue3制作一幅世界地图,并实现点击下载按钮将图表转变为图片下载到本地. 使用插件: html2canvasnpm安装: npm install html2canvas组件引入 ...