java 自定义注解实现不同对象之间的拷贝(支持大小写、驼峰转换)
java 自定义注解实现不同对象之间的拷贝(支持大小写、驼峰转换)
1、需求
要实现两个属性名称完全不同的对象之间的拷贝。具体如下
原对象
/*** 原实体*/ @Data public class Source {/*** 按属性名称转*/@PropertyTransform(name = "targetName",transformStrategy = TransformStrategy.DEFAULT)String sourceName;/*** 大写转小写*/@PropertyTransform(transformStrategy = TransformStrategy.LOWER)String LOWER;/*** 小写转大写*/@PropertyTransform(transformStrategy = TransformStrategy.UPPER)String upper;/*** 驼峰命名*/@PropertyTransform(transformStrategy = TransformStrategy.HUMP)String high_and_down;}
目标对象
/*** 目标实体*/
@Data
public class Target {String targetName;String lower;String UPPER;String highAndDown;}
2、实现
我们可以看到上面原对象上的属性加入了自定义注解==@PropertyTransform==,具体实现如下
- 自定义注解
//RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Retention(RetentionPolicy.RUNTIME)
//声明注解的作用域在属性上
@Target(ElementType.FIELD)
@Component
public @interface PropertyTransform {/*** 目标属性* @return*/@AliasFor("name")String value() default "";/*** 目标属性* @return*/@AliasFor("value")String name() default "";/*** 转换策略 见枚举类* @return*/TransformStrategy transformStrategy() default TransformStrategy.DEFAULT;}
转换策略枚举类
/*** 转换策略*/ public enum TransformStrategy {/*** 按名称转*/DEFAULT,/*** 小写*/LOWER,/*** 大写*/UPPER,/*** 驼峰*/HUMP,}
编写转换工具类,利用反射实现需求
public class PropertiesTransformUtils {private static final Pattern linePattern = Pattern.compile("_(\\w)");@SneakyThrowspublic static Object copy(Object source,Class<?> target){Class<?> sourceClass = source.getClass();//获取原实体下的所有属性Field[] fields = sourceClass.getDeclaredFields();//记录转换名称后的属性名以及属性值Map<String,Object> objMap = new HashMap<>(fields.length);for (Field field : fields) {field.setAccessible(true);//获取属性上的注解PropertyTransform propertyTransform = field.getAnnotation(PropertyTransform.class);//根据不同的策略进行对原实体的属性名称进行修改if (propertyTransform != null){if (!"".equals(propertyTransform.name())){objMap.put(propertyTransform.name(),field.get(source));}else if (!TransformStrategy.DEFAULT.equals(propertyTransform.transformStrategy())){if (TransformStrategy.LOWER.equals(propertyTransform.transformStrategy())){objMap.put(field.getName().toLowerCase(),field.get(source));}elseif (TransformStrategy.UPPER.equals(propertyTransform.transformStrategy())){objMap.put(field.getName().toUpperCase(),field.get(source));}elseif (TransformStrategy.HUMP.equals(propertyTransform.transformStrategy())){objMap.put(lineToHump(field.getName()),field.get(source));}}}}//将值拷贝到目标实体Object targetObj = target.newInstance();for (Field declaredField : target.getDeclaredFields()) {Object value = objMap.getOrDefault(declaredField.getName(),null);declaredField.setAccessible(true);declaredField.set(targetObj,value);}return targetObj;}/** 下划线转驼峰 */public static String lineToHump(String str) {str = str.toLowerCase();Matcher matcher = linePattern.matcher(str);StringBuffer sb = new StringBuffer();while (matcher.find()) {matcher.appendReplacement(sb, matcher.group(1).toUpperCase());}matcher.appendTail(sb);return sb.toString();}}
3、测试
@Test
public void testPT(){Source source = new Source();source.setUpper("upper");source.setHigh_and_down("highanddown");source.setLOWER("lower");source.setSourceName("sourceName");System.out.println(source.toString());Target target = (Target) PropertiesTransformUtils.copy(source,Target.class);System.out.println(target.toString());}
测试结果
Source(sourceName=sourceName, LOWER=lower, upper=upper, high_and_down=highanddown)
Target(targetName=sourceName, lower=lower, UPPER=upper, highAndDown=highanddown)
java 自定义注解实现不同对象之间的拷贝(支持大小写、驼峰转换)相关推荐
- java自定义注解实现校验对象属性是否为空
前面学习了如何自定义一个注解:java如何优雅的自定义一个注解 下面来实战演示一下如何使用自定义注解做一些实际的功能.比如校验对象属性是否为空. 一.自定义一个NotNull注解 我们自定义一个Not ...
- java 自定义注解_两步实现Java自定义注解
什么是注解? 注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理. 那么我们怎么去实现自个的注解,也就是自定义注解呢? 一.自定义一个注解( ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...
Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...
- springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)
初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解.问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根 ...
- 数据脱敏——基于Java自定义注解实现日志字段脱敏
上文说了数据过敏主要有两个思路:第一个就是在序列化实体之前先把需要脱敏的字段进行处理,之后正常序列化:第二个就是在实体序列化的时候,对要脱敏的字段进行处理. 脱敏实现思路 这里探讨第一种方法,用基于自 ...
- java自定义注解实现前后台参数校验
其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 ...
- Java 自定义注解及使用场景
文章目录 1 什么是注解(Annotation) 2 元注解 2.1 @Target 2.2 @Retention 2.3 @Repeatable 2.4 @Inherited 示例1 反射获取注解 ...
- Java 自定义注解简单使用
Java 自定义注解简单使用 文章目录 Java 自定义注解简单使用 第一步:在 pom.xml 下引入反射框架 第二步:自定义注解 第三步:写两个测试实体类 第四步:写个工具类扫描被注解的类(核心) ...
最新文章
- AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss代码调试过程
- linux 字符驱动阻塞型 等待队列
- c语言文学研究助手题目,各位达人,给小弟一个文学研究助手的c程序啊!急啊!谢谢大家啦!...
- mysql @符号_quot;Incorrect string value quot; mysql 乱码 my插入emoji Yii2
- 水很深的深度学习-Task01深度学习概述与数学基础
- ASIFormDataRequest实现上传图片
- 精确到门牌号的地图_IP地址精准查询工具:能精确到门牌号
- Proteus与emu8086实现流水灯联调
- 首席分析师:教你解读政策取向
- 苹果官方付费升级内存_vivo用户必看!官方推出扩容服务,最高升级到128G!
- ProcessOn 作图工具
- 剧本供不应求,会写课堂助力创作者入局剧本杀
- 光耦p621引脚图_p421光耦引脚图和代换
- 微软Excel 2007 打勾方框/框里打勾
- 五子棋游戏源码和核心算法的讲解(简易五子棋web版)
- wps表格转换HTML且能修改,怎么把WPS表格文件转换为WPS文字文件?
- 14 Java集合(集合框架+泛型+ArrayList类+LinkedList类+Vector类+HashSet类等)
- GitLab-CI 基础介绍
- Code Review 在丁香医生前端团队的实践
- Java项目:JavaWeb实现网上图书商城系统
热门文章
- 让一切随风--------2016年中总结
- Zynq——PL_BRAM_PS数据传输
- “显卡巨头”英伟达跌落神坛?利润暴跌七成 芯片制造商命运发生转变
- 高考结束了以后应该做的事情(个人经历的总结)
- 仿翁天信旅行足迹地图源码
- GPT-4真的发布了,ChatGPT Plus用户可试用
- P60-前端基础HTML-表格样式
- c语言入门自学手机版,C语言入门学习软件下载-C语言入门学习手机版v1.0.2 - 起点软件园...
- C#调用python实现shp文件的CGCS2000坐标系向WGS84坐标系转换
- 在excel表格中插入公式