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

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. Docker 笔记学习

    文章目录 概述 CentOS7 Docker 安装 启动 Docker 后台服务 镜像加速 Docker常用命令 如何创建一个镜像 存储和载入镜像 上传镜像 容器的基本操作 创建容器 终止容器 如何进 ...

  2. ES6语法:class类,从了解到使用

    前期提要:  JavaScript 语言中,在使用类之前,生成实例对象的传统方法是通过使用构造函数. 一.构造函数: 定义:通过  new 函数名  来实例化对象的函数叫构造函数.   主要功能:为初 ...

  3. APK 的前世今生:从 Android 源码到 apk 的编译打包流程

    最近想要研究热修复的原理,并自己实现一套简单的热修复框架(音视频的坑刚挖好就又挖另一个坑了2333),已经在看书入门 c++,方便后续查看业内一些知名热修复框架的源码,另外在涉及编译期/运行时修改代码 ...

  4. sql字段拆分 ,连表子查询获取值

    1.连表子查询获取值 select bas.name,bas.id_card_num,bas.mobil_no,gender,bas.birthday,bas.height,bas.weight,pr ...

  5. Oracle数据库常见sql

    -新建表:create table table_name( id varchar2(300) primary key, name varchar2(200) not null); --插入数据 ins ...

  6. 内部类和Lambda

    1.1 内部类的基本使用 在一个类中定义一个类.举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定义格式 格式&举例: /* 格式:    class 外部类名{   修饰符 c ...

  7. Qt学习笔记-Qtcreator的webkit和qt4.7.0的版本有关

    之前下载了一个最新的是qtcreator,是通过ubuntu的是apt-get下载的.可是里面没有webkit控件.网上的网友说是最新的没有了.要用老版的,于是下载了一个2.5.2的就正常了. 用老版 ...

  8. LockSupport的深入浅出

    public static void main(String[] args)throws Exception { final Object obj = new Object(); Thread A = ...

  9. 轻量级 Kubernetes K3s - Github热点

    轻量级 Kubernetes k3s star: 15.5k K3s是完全符合生产要求的Kubernetes发行版, 安装简单,可用于生产,整个二进制文件小于100M,作为单一文件打包部署,优势在于, ...

  10. 解决GitHub下载速度慢的问题(已解决)

    核心:通过码云导入github资源,通过码云转接下载. $\color{blue}{1. 找到需要下载的GitHub地址}$  ​ 然后复制链接,转到码云上去. $\color{blue}{2. 打开 ...