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

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之间的相互转化的更多相关文章

  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. css 04-CSS选择器:伪类

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

  2. Tomcat9没有service.bat

    下载个Windows版本的才有service.bat,默认是不带的. 附上tomcat9的下载地址: https://archive.apache.org/dist/tomcat/tomcat-9/v ...

  3. 网站开发学习Python实现-Django的models学习-生鲜项目(6.3.2)

    @ 目录 1.说明 2.模型类的设计 3.代码的具体实现 4.详情地址 关于作者 1.说明 models是django的很重要的部分,所以深入研究. 本文章的所研究项目为黑马教育python课程中的项 ...

  4. CSRF学习

    前提环境:网站存在CSRF漏洞(也就是过于相信访问请求,只判断了用户是否存在cookie,并未判断请求的发起者) CSRF攻击原理,用户A需要转账,用户A正常向银行网站发送请求登录,登录成功后银行网站 ...

  5. ⑦SpringCloud 实战:引入Sleuth组件,完善服务链路跟踪

    这是SpringCloud实战系列中第7篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  6. 赶紧收藏!Spring MVC 万字长文笔记,我愿奉你为王者笔记!

    Spring MVC Spring MVC是目前主流的实现MVC设计模式的企业级开发框架,Spring框架的一个子模块,无需整合Spring,开发起来更加便捷. 什么是MVC设计模式? 将应用程序分为 ...

  7. webform中DropdownList绑定多个字段

    说明 ListItem中有Attributes属性,手动创建一个自定义属性,赋值需要绑定的字段的值. 这样的话,前台js也可以获取到,能够显示到前台html,进行控制. 代码 foreach(Data ...

  8. 仅4步,就可通过SQL进行分布式死锁的检测与消除

    摘要:本文主要介绍在 GaussDB(DWS) 中,如何通过 SQL 语句,对分布式死锁进行检测和恢复. 分布式数仓应用场景中,我们经常遇到数据库系统 hang 住的问题,所谓 hang 是指虽然数据 ...

  9. CAP理论和BASE理论及数据库的ACID中关于一致性及不同点的思考

    CAP定理又被称作是布鲁尔定理,是加州大学伯克利分销计算机科学家里克在2000年提出,是分布式理论基础. CAP:是分布式系统的理论基础 [一致性  可用性   分区容错性] BASE理论是对CAP中 ...

  10. TurtleBot3 Waffle (tx2版华夫)(8)键盘控制

    1)[Remote PC] 启动roscore $ roscore 2)[Turbot3] 启动turbot3 $ roslaunch turbot3_bringup minimal.launch 3 ...