package dtotransfer.util;

import dtotransfer.annotation.DomainField;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method; public class DtoFieldConveter { public static Object fill(Object source, Class<?> targetClass) throws Exception {
Class<?> sourceCls = source.getClass(); Field[] sourceFields = sourceCls.getDeclaredFields();
Field[] targetFields = targetClass.getDeclaredFields();
Object targetObject = targetClass.newInstance(); for (Field sourceField : sourceFields) {
Annotation[] sourceFieldAnnotations = sourceField.getAnnotations(); for (Annotation sourceFieldAnno : sourceFieldAnnotations) {
if (sourceFieldAnno.annotationType() == DomainField.class) {
DomainField anno = (DomainField) sourceFieldAnno;
if (anno.targetClass() == targetClass) {
for (Field targetField : targetFields) {
if (targetField.getName().equals(anno.targetProperty())) {
Method sourceMethod = sourceCls.getMethod("get" + sourceField.getName()
.substring(0, 1).toUpperCase()
+ sourceField.getName().substring(1));
Method targetMethod = targetClass.getMethod("set" + targetField.getName()
.substring(0, 1).toUpperCase()
+ targetField.getName().substring(1),sourceField.getType());
Object sourceFieldValue = sourceMethod.invoke(source);
targetMethod.invoke(targetObject, sourceFieldValue);
// targetField.setAccessible(true);
// targetField.set(targetObject, sourceField.get(source));
}
}
}
}
}
}
return targetObject;
}
}
package dtotransfer.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.Target; import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME; @Target({FIELD})
@Retention(RUNTIME)
public @interface DomainField { Class<?> targetClass(); String targetProperty(); // String [] targetProperties();
}

把DTO实体和DOMAIN实体映射起来,字段名称可不同。

package dtotransfer.dto;

import dtotransfer.annotation.DomainField;
import dtotransfer.domain.AdminActivity; public class AddTenantInfoRequestDTO { @DomainField(targetClass = AdminActivity.class, targetProperty = "description")
private String tenantName; @DomainField(targetClass = AdminActivity.class, targetProperty = "ip")
private String businessName; private String principal; private String principalPhone; public String getTenantName() {
return tenantName;
} public void setTenantName(String tenantName) {
this.tenantName = tenantName;
} public String getBusinessName() {
return businessName;
} public void setBusinessName(String businessName) {
this.businessName = businessName;
} public String getPrincipal() {
return principal;
} public void setPrincipal(String principal) {
this.principal = principal;
} public String getPrincipalPhone() {
return principalPhone;
} public void setPrincipalPhone(String principalPhone) {
this.principalPhone = principalPhone;
}
}
package dtotransfer.util;

import dtotransfer.domain.AdminActivity;
import dtotransfer.dto.AddTenantInfoRequestDTO; public class DtoDomainMapping { public static void main(String []args) throws Exception
{
AddTenantInfoRequestDTO requestDTO=new AddTenantInfoRequestDTO();
requestDTO.setBusinessName("yang");
requestDTO.setTenantName("127.0.0.1"); Object object= DtoFieldConveter.fill(requestDTO,AdminActivity.class);
}
}

DTO转DOMAIN动态转换类。的更多相关文章

  1. DataTable与DTO对象的简易转换类

    在web开发过程中,有时候为了数据传输的方便,比如:后台需要更新前端的ViewModel,此时我们定义一个与前端ViewModel结构一样的DTO对象,从数据层获取数据后,将数据封装成DTO然后序列化 ...

  2. Java 编程的动态性,第 5 部分: 动态转换类--转载

    在第 4 部分“ 用 Javassist 进行类转换”中,您学习了如何使用 Javassist 框架来转换编译器生成的 Java 类文件,同时写回修改过的类文件.这种类文件转换步骤对于做出持久变更是很 ...

  3. Java动态生成类以及动态添加属性

    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...

  4. .Net基础——程序集与CIL HttpClient封装方法 .Net Core 编码规范 C#中invoke和beginInvoke的使用 WebServeice 动态代理类

    .Net基础——程序集与CIL   1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll ...

  5. C++学习之动态数组类的封装

    动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...

  6. Python 中使用动态创建类属性的机制实现接口之后的依赖

    我们在自动化测试中经常会需要关联用例处理,需要动态类属性: 推荐使用第二种方法: 创建:setattr() 获取:getattr() 两种,如何创建 类属性 loan_id # 第一种,创建 # 类名 ...

  7. NAT及静态转换,动态转换及PAT

    NAT及静态转换,动态转换及PAT 案例1:配置静态NAT 案例2:配置端口映射 案例3:配置动态NAT 案例4:PAT配置 案例5:办公区Internet的访问 1 案例1:配置静态NAT 1.1 ...

  8. Spring自定义转换类,让@Value更方便

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 关于配置的文章已经写了很多,相信看过的人还是会有一定收获的,系列文章可阅读:南瓜慢说-配置相关文章.对于@Val ...

  9. Roslyn 编译器Api妙用:动态生成类并实现接口

    在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...

随机推荐

  1. Python3基础系列-程序模板及代码本质

    概要 横看成岭侧成峰,远近高低各不同.但是,程序的设计核心思想却是很简单,简单理解就是有一个输入,对输入的处理环节,最后得出一个输出.这个过程中的设计及其实现却是各不相同.本节的主要内容如下: 程序设 ...

  2. Android中,如何提升Layout的性能?

    Layout 是 Android 应用中直接影响用户体验的关键部分.如果实现的不好,你的 Layout 会导致程序非常占用内存并且 UI 运行缓慢.Android SDK 带有帮助你找到 Layout ...

  3. 单片机软件proteus的汉化步骤

    整体思想:把汉化包里的文件替换软件的英文的软件 右键打开文件安装的位置,找到Translations文件夹,打开它等待被替换. 打开这个找到Translations文件夹,把下面的文件全部复制替换上面 ...

  4. python执行方式及变量

    .python执行方式 (1)交互式:调试方便,无法保存代码 (2)命令行方式:可以永久保存代码 (3)python执行阶段 先启动python解释器,解释器像文本编辑器一样将文件内容从硬盘读到内存, ...

  5. JavaScrip两个函数的设置为回调

    1.javascript异步编程之回调函数 function fn2(data){ alert(data) } function fn1(callback){ var data = 12+1; cal ...

  6. Oracle CPU使用率过高问题处理

    1.下载Process Explorer 2.打开Process Explorer,查看CPU使用情况最高的进程 3.双击该进程,查看详情 \ 4.    获取cpu使用最好的线程tid 5.     ...

  7. Alpha冲刺(2/10)——2019.4.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  8. RFC-RTSP

    Network Working Group H. Schulzrinne Request for Comments: 2326 Columbia U. Category: Standards Trac ...

  9. UltralEdit 替换回车换行符

    打开 Ue 工具,写下内容,如下图: 然后按 Ctrl + r,输入 ^p,点击按钮 “全部替换”, 如下图:

  10. poj3259 Wormholes(Bellman-Ford判断负圈)

    https://vjudge.net/problem/POJ-3259 一开始理解错题意了,以为从A->B一定得走路,B->A一定得走虫洞.emmm其实回来的时候可以路和虫洞都可以走,只要 ...