Entity与Entity之间的相互转化
一。两个实体类的属性名称对应之间的转化
1.两个实体类
- public class Entity1 {
- private Integer id;
- private String name;
- private Integer age;
- private byte sex;
- // get/set
- }
- public class Entity2 {
- private String name;
- private Double sal;
- private Integer age;
- // get/set
- }
2。Entity2Entity 转化类
- public class Entity2Entity {
- public static void main(String[] args) throws Exception {
- Entity1 en = new Entity1(1, "zcj", 18, (byte)1);
- Object parse = parse(en,new Entity2());
- System.out.println(parse);
- }
- public static <T, F> F parse(T src, F target) throws Exception{
- Method[] srcMethods = src.getClass().getMethods();
- Method[] targetMethod = target.getClass().getMethods();
- for(Method m : srcMethods) {
- if(m.getName().startsWith("get")) {
- Object result = m.invoke(src);
- for(Method mm : targetMethod) {
- if(mm.getName().startsWith("set") && mm.getName().substring(3).
- equals(m.getName().substring(3))) {
- mm.invoke(target,result);
- }
- }
- }
- }
- return target;
- }
- }
3。运行结果
- PersonDto [personId=1, personName=zcj, personAge=12, sal=12.0]
二。基于实体类中要转化的get方法或者属性进行转化
- package com.entity.demo3;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import com.entity.demo.Entity1;
- import com.entity.demo.Entity2;
- public class EntityUtil {
- public static void main(String[] args) {
- Entity1 src = new Entity1(1, "zcj", 18, (byte)1);
- Entity2 target = new Entity2();
- // target = entity2entityByMethod(src,target);
- target = entity2entityByField(src,target);
- System.out.println(target);
- }
- // 首字母转大写
- public static String firstChartToUpper(String str) {
- if (Character.isUpperCase(str.charAt(0))) {
- return str;
- }
- StringBuffer sb = new StringBuffer();
- return sb.append(Character.toUpperCase(str.charAt(0))).append(str.substring(1)).toString();
- }
- /**
- * 基于实体类中要转化的get方法获取
- * @param src
- * @param target
- * @return
- */
- public static <T, F> F entity2entityByMethod(T src, F target) {
- Field[] targetFields = target.getClass().getDeclaredFields();
- for (Field field : targetFields) {
- try {
- Method method = src.getClass().getMethod("get" + firstChartToUpper(field.getName()));
- Object value = method.invoke(src);
- field.setAccessible(true);
- field.set(target, value);
- } catch (Exception e) {
- continue;
- }
- }
- return target;
- }
- /**
- * 基于实体类中属性进行转换
- * @param src
- * @param target
- * @return
- */
- public static <T, F> F entity2entityByField(T src, F target) {
- Field[] srcFields = src.getClass().getDeclaredFields();
- Class<? extends Object> class1 = target.getClass();
- for (Field field : srcFields) {
- try {
- field.setAccessible(true);
- Object value = field.get(src);
- if(value == null) {
- continue;
- }
- Method mm = class1.getMethod("set"+firstChartToUpper(field.getName()),value.getClass());
- mm.invoke(target, value);
- } catch (Exception e) {
- e.printStackTrace();
- continue;
- }
- }
- return target;
- }
- }
三。利用反射+注解进行转化
1.两个实体类
- public class Pseron {
- private String perId;
- private String perName;
- private String perAge;
- private Double sal;
- private Integer pno;
- }
- public class PersonDto {
- @RelMapper(value="perId")
- private String personId;
- @RelMapper(value="perName")
- private String personName;
- @RelMapper(value="perAge")
- private String personAge;
- private Double sal;
- }
2.一个自定义的注解
- //Target 注解的使用域,FIELD表示使用在属性上面,TYPE表示使用在类上面
- @Target({ElementType.FIELD,ElementType.TYPE})
- //Retention 设置注解的生命周期 ,这里定义为RetentionPolicy.RUNTIME 非常关键
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface Mapper {
- //自定义属性
- String value() default "";
- }
3.转化类
- public class Entity2Dto {
- public static void main(String[] args){
- Object en2Dto = en2Dto(new Pseron("1","zcj", "12",12.0,null), new PersonDto());
- System.out.println(en2Dto);
- }
- public static Object en2Dto(Object src,Object target) {
- Field[] targetFields = target.getClass().getDeclaredFields();
- Class<? extends Object> srcFields = src.getClass();
- String name;
- for (Field field : targetFields) {
- try {
- field.setAccessible(true);
- // 判断这个字段上是否有相应的注解信息(RelMapper.class)
- if(field.isAnnotationPresent(Mapper.class)){
- Mapper annotation = field.getAnnotation(Mapper.class);
- name = annotation.value();
- }else {
- name = field.getName();
- }
- Field field2 = srcFields.getDeclaredField(name);
- if(field2 != null) {
- field2.setAccessible(true);
- }
- Object object = field2.get(src);
- field.set(target, object);
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- return target;
- }
- }
Entity与Entity之间的相互转化的更多相关文章
- 分享公司Entity与DTO之间数据拷贝的方法
主题 最早以前自学java web的时候,数据库查询出来一个Entity对象(CMP对象).就直接传给前台展示了.并没有用到DTO对象,开始并没有觉得有什么不好...后来发现还是需要一些DTO对象来专 ...
- ASP.NET-MVC中Entity和Model之间的关系
Entity 与 Model之间的关系图 ViewModel类是MVC中与浏览器交互的,Entity是后台与数据库交互的,这两者可以在MVC中的model类中转换 MVC基础框架 来自为知笔记(Wiz ...
- Types of Entity in Entity Framework:
http://www.entityframeworktutorial.net/Types-of-Entities.aspx We created EDM for existing database i ...
- .NET Core Entity使用Entity Framework Core链接数据库
首先安装Nuget包 Install-package Microsoft.EntityFrameworkCore Install-package Microsoft.EntityFrameworkCo ...
- java string和int之间的相互转化
java 中string和int之间的相互转化 1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); ...
- 值类型之间的相互转化,运算符,if条件判断,循环,函数
值类型之间的相互转化 number | string | boolean 一.转换为boolean=>Boolean(a); var num = 10; var s = '123'; var b ...
- 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 ...
- 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 ...
- js 类型之间的相互转化
设置元素对象属性 var img = document.querySelector("img") img.setAttribute("src","ht ...
- Python中的列表,元组,字符串之间的相互转化
Python中的列表元组和字符串之间的相互转化需要利用,tuple(),list(),str(). 示例如下: >>> the_string = "hello I'am x ...
随机推荐
- 使用脚手架搭建vue项目
全局安装环境 安装webpack npm install webpack -g 安装vue脚手架 npm install -g @vue/cli-init 初始化vue项目 vue init webp ...
- css 04-CSS选择器:伪类
04-CSS选择器:伪类 #伪类(伪类选择器) 伪类:同一个标签,根据其不同的种状态,有不同的样式.这就叫做"伪类".伪类用冒号来表示. 比如div是属于box类,这一点很明确,就 ...
- vue第十五单元(熟练使用vue-router插件)
第十五单元(熟练使用vue-router插件) #课程目标 1.掌握路由嵌套 2.掌握导航守卫 #知识点 #一.路由嵌套 很多时候,我们会在一个视口中实现局部页面的切换.这时候就需要到了嵌套路由. 也 ...
- Vue3 使用 svg-sprite-loader 实现 svg 图标按需加载
前面文章有讲到 svg 图标按需加载的优势以及 Vue 如何使用 vue-svg-icon 实现 svg 图标按需载入: https://www.cnblogs.com/Leophen/p/13201 ...
- [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务
[从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 目录 [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 0x00 摘要 0x01 业务领域 0 ...
- 一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
摘要:一次由fork引发的时延抖动问题. 背景介绍 华为云数据库GaussDB(for Redis) 是一款基于计算存储分离架构,兼容Redis生态的云原生NoSQL数据库:它依靠共享存储池实现了强一 ...
- 爬取并分析一下B站的最热视频排行榜,看看大家都喜欢看什么视频
前言 现在大家的生活中,已经越来越离不开B站了,2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户.源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉 ...
- RPC 核心,万变不离其宗
微信搜 「yes的练级攻略」干货满满,不然来掐我,回复[123]一份20W字的算法刷题笔记等你来领. 个人文章汇总:https://github.com/yessimida/yes 欢迎 star ! ...
- JVM 经典垃圾收集器 —— CMS 收集器
本文部分摘自<深入理解 Java 虚拟机第三版> 概述 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器.由于大部分 Java 应用主要 ...
- 前端可视化开发--liveload
在前端开发中,我们会频繁的修改html.css.js,然后刷新页面,开效果,再调整,再刷新,不知不觉会浪费掉我们很多时间.有没有什么方法,我在编辑器里面改了代码以后,只要保存,浏览器就能实时刷新.经过 ...