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 ...
随机推荐
- Cloudera Manager API使用
Cloudera Manager提供了很多API供用户进行访问,因此可以利用其提供的API进行大数据集群中各种服务的状态检测.监控以及服务的启停操作. 版本信息 Cloudera Manager 6. ...
- Java中构造代码块的使用
例子1 public class Client { { System.out.println("执行构造代码块1"); } { System.out.println("执 ...
- js中点回车enter触发事件&layui弹窗按enter键不停弹窗问题的解决&js实现鼠标焦点自动落到文本框(layui)
js中回车触发事件 一. document.onkeydown = function (e) { // 回车提交表单 // 兼容FF和IE和Opera var theEvent = window.e ...
- IIS本地部署局域网可随时访问的项目+mysql可局域网内访问
开端口即可 或者以下 原理 在本机的IIS下创建一个网站,文件目录直接指向Web项目文件夹 步骤 1.项目的启动项目为web 2.在iis中创建一个新的网站(Work_TK_EIS) 文件目录为web ...
- Vue2+Koa2+Typescript前后端框架教程--03后端路由和三层模式配置
昨天将Koa2的基础框架和自动编译调试重启服务完成,今天开始配置路由和搭建基础的三层架构模式. 路由中间件:koa-router,即路由导航,就是我们平时使用最广泛的get/post方法执行的URL路 ...
- idea提交svn不显示新建文件
在idea中,使用svn提交时可能会出现 预期文件没出现在提交目录里. 是因为没有把新建文件添加到版本控制里. 解决办法:右键选择文件→subversion→add to vcs. 自动把新文件添加 ...
- RTC_Configuration
Void RTC_Configuration(void)// 实时时钟的初始化配置 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Peri ...
- 多线程并行_countDown
/** * 首次启动加载数据至缓存 */ public class ApplicationStartTask { private static Logger logger = LoggerFactor ...
- ROS开源小车TurtleBot3详情介绍(Burger)
您为什么要选择ROS开源智能小车 ROS(RobotOperating System,机器人操作系统)是目前世界上更主流更多人使用的的机器人开源操作系统.它可以提供操作系统应有的服务,包括硬件抽象,底 ...
- Turtlebot3新手教程:Open-Manipulator机械臂
*本文针对如何结合turtlebot3和Open-Manipulator机械臂做出讲解 测试在Ubuntu 16.04, Linux Mint 18.1和ROS Kinetic Kame下进行 具体步 ...