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 自定义注解实现不同对象之间的拷贝(支持大小写、驼峰转换)相关推荐

  1. java自定义注解实现校验对象属性是否为空

    前面学习了如何自定义一个注解:java如何优雅的自定义一个注解 下面来实战演示一下如何使用自定义注解做一些实际的功能.比如校验对象属性是否为空. 一.自定义一个NotNull注解 我们自定义一个Not ...

  2. java 自定义注解_两步实现Java自定义注解

    什么是注解? 注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理. 那么我们怎么去实现自个的注解,也就是自定义注解呢? 一.自定义一个注解( ...

  3. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  4. java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...

  5. springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)

    初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解.问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根 ...

  6. 数据脱敏——基于Java自定义注解实现日志字段脱敏

    上文说了数据过敏主要有两个思路:第一个就是在序列化实体之前先把需要脱敏的字段进行处理,之后正常序列化:第二个就是在实体序列化的时候,对要脱敏的字段进行处理. 脱敏实现思路 这里探讨第一种方法,用基于自 ...

  7. java自定义注解实现前后台参数校验

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 ...

  8. Java 自定义注解及使用场景

    文章目录 1 什么是注解(Annotation) 2 元注解 2.1 @Target 2.2 @Retention 2.3 @Repeatable 2.4 @Inherited 示例1 反射获取注解 ...

  9. Java 自定义注解简单使用

    Java 自定义注解简单使用 文章目录 Java 自定义注解简单使用 第一步:在 pom.xml 下引入反射框架 第二步:自定义注解 第三步:写两个测试实体类 第四步:写个工具类扫描被注解的类(核心) ...

最新文章

  1. AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss代码调试过程
  2. linux 字符驱动阻塞型 等待队列
  3. c语言文学研究助手题目,各位达人,给小弟一个文学研究助手的c程序啊!急啊!谢谢大家啦!...
  4. mysql @符号_quot;Incorrect string value quot; mysql 乱码 my插入emoji Yii2
  5. 水很深的深度学习-Task01深度学习概述与数学基础
  6. ASIFormDataRequest实现上传图片
  7. 精确到门牌号的地图_IP地址精准查询工具:能精确到门牌号
  8. Proteus与emu8086实现流水灯联调
  9. 首席分析师:教你解读政策取向
  10. 苹果官方付费升级内存_vivo用户必看!官方推出扩容服务,最高升级到128G!
  11. ProcessOn 作图工具
  12. 剧本供不应求,会写课堂助力创作者入局剧本杀
  13. 光耦p621引脚图_p421光耦引脚图和代换
  14. 微软Excel 2007 打勾方框/框里打勾
  15. 五子棋游戏源码和核心算法的讲解(简易五子棋web版)
  16. wps表格转换HTML且能修改,怎么把WPS表格文件转换为WPS文字文件?
  17. 14 Java集合(集合框架+泛型+ArrayList类+LinkedList类+Vector类+HashSet类等)
  18. GitLab-CI 基础介绍
  19. Code Review 在丁香医生前端团队的实践
  20. Java项目:JavaWeb实现网上图书商城系统

热门文章

  1. 让一切随风--------2016年中总结
  2. Zynq——PL_BRAM_PS数据传输
  3. “显卡巨头”英伟达跌落神坛?利润暴跌七成 芯片制造商命运发生转变
  4. 高考结束了以后应该做的事情(个人经历的总结)
  5. 仿翁天信旅行足迹地图源码
  6. GPT-4真的发布了,ChatGPT Plus用户可试用
  7. P60-前端基础HTML-表格样式
  8. c语言入门自学手机版,C语言入门学习软件下载-C语言入门学习手机版v1.0.2 - 起点软件园...
  9. C#调用python实现shp文件的CGCS2000坐标系向WGS84坐标系转换
  10. 在excel表格中插入公式