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. lambda表达式 匿名函数

    lambda函数是一种快速定义单行最小函数的方法,是从Lisp借鉴而来的,可以用在任何需要函数的地方. 基础 lambda语句中,冒号前是参数,可以有多个,用逗号分割:冒号右边是返回值. lambda ...

  2. 从零开始搭建一个从Win7环境备份至CentOS7的SVN双机备份环境

    ★几个关键的事项★ 需要关闭防火墙filewalld跟selinux ,在root用户下操作: [root@localhost svnRepos]# systemctl stop firewalld ...

  3. 树莓派mariadb折腾

    今天在树莓派之中安装mysql,结果被我安装了mariadb,这样做很讨厌,但是也可以将就用.记录一下折腾的过程. 安装就还是使用sudo apt install mysql 1.安装之后需要使用工具 ...

  4. bzo1606: [Usaco2008 Dec]Hay For Sale 购买干草

    1606: [Usaco2008 Dec]Hay For Sale 购买干草 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1338  Solved: 9 ...

  5. Prior Posterior和Likelihood的理解与几种表达方式

  6. JQ04

    1.JQ插件 使用插件扩展jq的功能 1)插入插件的步骤: 引入JQ文件,引入插件,若有用到css,需要引入css.使用插件. 2)jquery.color.js <!DOCTYPE html& ...

  7. REST风格的增删改查(2)

    一.源码 1.页面 index.jsp <a href="emps">List All Employee</a> <br><br> ...

  8. Deepin 15.4 更改为 阿里云源

    自带的 软件包源 不好用,卡顿严重,准备替换它: 方式一:deepin linux 如何更新或者更换软件源(注意:好像不起作用) 方式二:[推荐]利用 阿里云 提供的镜像快速更换本地的 yum 源 ( ...

  9. C++加载动态库的顺序

      1. where to load dynamic so: (rpath isdetermined and recorded when compiling, it is also used to f ...

  10. [转载]理解 Git 分支管理最佳实践

    原文 理解 Git 分支管理最佳实践 Git 分支有哪些 在进行分支管理讲解之前,我们先来对分支进行一个简单的分类,并明确每一类分支的用途. 分支分类 根据生命周期区分 主分支:master,deve ...