一。两个实体类的属性名称对应之间的转化

1.两个实体类

  1. public class Entity1 {
  2.  
  3. private Integer id;
  4. private String name;
  5. private Integer age;
  6. private byte sex;
  7. // get/set
  8. }
  9.  
  10. public class Entity2 {
  11. private String name;
  12. private Double sal;
  13. private Integer age;
  14. // get/set
  15. }

2。Entity2Entity 转化类

  1. public class Entity2Entity {
  2. public static void main(String[] args) throws Exception {
  3. Entity1 en = new Entity1(1, "zcj", 18, (byte)1);
  4. Object parse = parse(en,new Entity2());
  5. System.out.println(parse);
  6. }
  7.  
  8. public static <T, F> F parse(T src, F target) throws Exception{
  9. Method[] srcMethods = src.getClass().getMethods();
  10. Method[] targetMethod = target.getClass().getMethods();
  11. for(Method m : srcMethods) {
  12. if(m.getName().startsWith("get")) {
  13. Object result = m.invoke(src);
  14. for(Method mm : targetMethod) {
  15. if(mm.getName().startsWith("set") && mm.getName().substring(3).
  16. equals(m.getName().substring(3))) {
  17. mm.invoke(target,result);
  18. }
  19. }
  20. }
  21. }
  22. return target;
  23. }
  24.  
  25. }

3。运行结果

  1. PersonDto [personId=1, personName=zcj, personAge=12, sal=12.0]

  

二。基于实体类中要转化的get方法或者属性进行转化

  1. package com.entity.demo3;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6.  
  7. import com.entity.demo.Entity1;
  8. import com.entity.demo.Entity2;
  9.  
  10. public class EntityUtil {
  11.  
  12. public static void main(String[] args) {
  13. Entity1 src = new Entity1(1, "zcj", 18, (byte)1);
  14. Entity2 target = new Entity2();
  15. // target = entity2entityByMethod(src,target);
  16. target = entity2entityByField(src,target);
  17. System.out.println(target);
  18. }
  19.  
  20. // 首字母转大写
  21. public static String firstChartToUpper(String str) {
  22. if (Character.isUpperCase(str.charAt(0))) {
  23. return str;
  24. }
  25. StringBuffer sb = new StringBuffer();
  26. return sb.append(Character.toUpperCase(str.charAt(0))).append(str.substring(1)).toString();
  27. }
  28.  
  29. /**
  30. * 基于实体类中要转化的get方法获取
  31. * @param src
  32. * @param target
  33. * @return
  34. */
  35. public static <T, F> F entity2entityByMethod(T src, F target) {
  36. Field[] targetFields = target.getClass().getDeclaredFields();
  37. for (Field field : targetFields) {
  38. try {
  39. Method method = src.getClass().getMethod("get" + firstChartToUpper(field.getName()));
  40. Object value = method.invoke(src);
  41. field.setAccessible(true);
  42. field.set(target, value);
  43. } catch (Exception e) {
  44. continue;
  45. }
  46. }
  47. return target;
  48. }
  49.  
  50. /**
  51. * 基于实体类中属性进行转换
  52. * @param src
  53. * @param target
  54. * @return
  55. */
  56. public static <T, F> F entity2entityByField(T src, F target) {
  57. Field[] srcFields = src.getClass().getDeclaredFields();
  58. Class<? extends Object> class1 = target.getClass();
  59. for (Field field : srcFields) {
  60. try {
  61. field.setAccessible(true);
  62. Object value = field.get(src);
  63. if(value == null) {
  64. continue;
  65. }
  66. Method mm = class1.getMethod("set"+firstChartToUpper(field.getName()),value.getClass());
  67. mm.invoke(target, value);
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. continue;
  71. }
  72. }
  73. return target;
  74. }
  75.  
  76. }

三。利用反射+注解进行转化

1.两个实体类

  1. public class Pseron {
  2. private String perId;
  3. private String perName;
  4. private String perAge;
  5. private Double sal;
  6. private Integer pno;
  7. }
  8.  
  9. public class PersonDto {
  10. @RelMapper(value="perId")
  11. private String personId;
  12. @RelMapper(value="perName")
  13. private String personName;
  14. @RelMapper(value="perAge")
  15. private String personAge;
  16. private Double sal;
  17. }

2.一个自定义的注解

  1. //Target 注解的使用域,FIELD表示使用在属性上面,TYPE表示使用在类上面
  2. @Target({ElementType.FIELD,ElementType.TYPE})
  3. //Retention 设置注解的生命周期 ,这里定义为RetentionPolicy.RUNTIME 非常关键
  4. @Retention(RetentionPolicy.RUNTIME)
  5. @Documented
  6. public @interface Mapper {
  7. //自定义属性
  8. String value() default "";
  9. }

3.转化类

  1. public class Entity2Dto {
  2. public static void main(String[] args){
  3. Object en2Dto = en2Dto(new Pseron("1","zcj", "12",12.0,null), new PersonDto());
  4. System.out.println(en2Dto);
  5. }
  6.  
  7. public static Object en2Dto(Object src,Object target) {
  8. Field[] targetFields = target.getClass().getDeclaredFields();
  9. Class<? extends Object> srcFields = src.getClass();
  10. String name;
  11. for (Field field : targetFields) {
  12. try {
  13. field.setAccessible(true);
  14. // 判断这个字段上是否有相应的注解信息(RelMapper.class)
  15. if(field.isAnnotationPresent(Mapper.class)){
  16. Mapper annotation = field.getAnnotation(Mapper.class);
  17. name = annotation.value();
  18. }else {
  19. name = field.getName();
  20. }
  21. Field field2 = srcFields.getDeclaredField(name);
  22. if(field2 != null) {
  23. field2.setAccessible(true);
  24. }
  25. Object object = field2.get(src);
  26. field.set(target, object);
  27. }catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. return target;
  32. }
  33.  
  34. }

Entity与Entity之间的相互转化的更多相关文章

  1. 分享公司Entity与DTO之间数据拷贝的方法

    主题 最早以前自学java web的时候,数据库查询出来一个Entity对象(CMP对象).就直接传给前台展示了.并没有用到DTO对象,开始并没有觉得有什么不好...后来发现还是需要一些DTO对象来专 ...

  2. ASP.NET-MVC中Entity和Model之间的关系

    Entity 与 Model之间的关系图 ViewModel类是MVC中与浏览器交互的,Entity是后台与数据库交互的,这两者可以在MVC中的model类中转换 MVC基础框架 来自为知笔记(Wiz ...

  3. Types of Entity in Entity Framework:

    http://www.entityframeworktutorial.net/Types-of-Entities.aspx We created EDM for existing database i ...

  4. .NET Core Entity使用Entity Framework Core链接数据库

    首先安装Nuget包 Install-package Microsoft.EntityFrameworkCore Install-package Microsoft.EntityFrameworkCo ...

  5. java string和int之间的相互转化

    java 中string和int之间的相互转化 1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); ...

  6. 值类型之间的相互转化,运算符,if条件判断,循环,函数

    值类型之间的相互转化 number | string | boolean 一.转换为boolean=>Boolean(a); var num = 10; var s = '123'; var b ...

  7. EntityFramework 学习 一 Colored Entity in Entity Framework 5.0

    You can change the color of an entity in the designer so that it would be easy to see related groups ...

  8. Entity Framework Tutorial Basics(8):Types of Entity in Entity Framework

    Types of Entity in Entity Framework: We created EDM for existing database in the previous section. A ...

  9. js 类型之间的相互转化

    设置元素对象属性 var img = document.querySelector("img") img.setAttribute("src","ht ...

  10. Python中的列表,元组,字符串之间的相互转化

    Python中的列表元组和字符串之间的相互转化需要利用,tuple(),list(),str(). 示例如下: >>> the_string = "hello I'am x ...

随机推荐

  1. 使用脚手架搭建vue项目

    全局安装环境 安装webpack npm install webpack -g 安装vue脚手架 npm install -g @vue/cli-init 初始化vue项目 vue init webp ...

  2. css 04-CSS选择器:伪类

    04-CSS选择器:伪类 #伪类(伪类选择器) 伪类:同一个标签,根据其不同的种状态,有不同的样式.这就叫做"伪类".伪类用冒号来表示. 比如div是属于box类,这一点很明确,就 ...

  3. vue第十五单元(熟练使用vue-router插件)

    第十五单元(熟练使用vue-router插件) #课程目标 1.掌握路由嵌套 2.掌握导航守卫 #知识点 #一.路由嵌套 很多时候,我们会在一个视口中实现局部页面的切换.这时候就需要到了嵌套路由. 也 ...

  4. Vue3 使用 svg-sprite-loader 实现 svg 图标按需加载

    前面文章有讲到 svg 图标按需加载的优势以及 Vue 如何使用 vue-svg-icon 实现 svg 图标按需载入: https://www.cnblogs.com/Leophen/p/13201 ...

  5. [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务

    [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 目录 [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 0x00 摘要 0x01 业务领域 0 ...

  6. 一场由fork引发的超时,让我们重新探讨了Redis的抖动问题

    摘要:一次由fork引发的时延抖动问题. 背景介绍 华为云数据库GaussDB(for Redis) 是一款基于计算存储分离架构,兼容Redis生态的云原生NoSQL数据库:它依靠共享存储池实现了强一 ...

  7. 爬取并分析一下B站的最热视频排行榜,看看大家都喜欢看什么视频

    前言 现在大家的生活中,已经越来越离不开B站了,2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户.源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉 ...

  8. RPC 核心,万变不离其宗

    微信搜 「yes的练级攻略」干货满满,不然来掐我,回复[123]一份20W字的算法刷题笔记等你来领. 个人文章汇总:https://github.com/yessimida/yes 欢迎 star ! ...

  9. JVM 经典垃圾收集器 —— CMS 收集器

    本文部分摘自<深入理解 Java 虚拟机第三版> 概述 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器.由于大部分 Java 应用主要 ...

  10. 前端可视化开发--liveload

    在前端开发中,我们会频繁的修改html.css.js,然后刷新页面,开效果,再调整,再刷新,不知不觉会浪费掉我们很多时间.有没有什么方法,我在编辑器里面改了代码以后,只要保存,浏览器就能实时刷新.经过 ...