DTO转DOMAIN动态转换类。
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动态转换类。的更多相关文章
- DataTable与DTO对象的简易转换类
在web开发过程中,有时候为了数据传输的方便,比如:后台需要更新前端的ViewModel,此时我们定义一个与前端ViewModel结构一样的DTO对象,从数据层获取数据后,将数据封装成DTO然后序列化 ...
- Java 编程的动态性,第 5 部分: 动态转换类--转载
在第 4 部分“ 用 Javassist 进行类转换”中,您学习了如何使用 Javassist 框架来转换编译器生成的 Java 类文件,同时写回修改过的类文件.这种类文件转换步骤对于做出持久变更是很 ...
- Java动态生成类以及动态添加属性
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...
- .Net基础——程序集与CIL HttpClient封装方法 .Net Core 编码规范 C#中invoke和beginInvoke的使用 WebServeice 动态代理类
.Net基础——程序集与CIL 1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll ...
- C++学习之动态数组类的封装
动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...
- Python 中使用动态创建类属性的机制实现接口之后的依赖
我们在自动化测试中经常会需要关联用例处理,需要动态类属性: 推荐使用第二种方法: 创建:setattr() 获取:getattr() 两种,如何创建 类属性 loan_id # 第一种,创建 # 类名 ...
- NAT及静态转换,动态转换及PAT
NAT及静态转换,动态转换及PAT 案例1:配置静态NAT 案例2:配置端口映射 案例3:配置动态NAT 案例4:PAT配置 案例5:办公区Internet的访问 1 案例1:配置静态NAT 1.1 ...
- Spring自定义转换类,让@Value更方便
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 关于配置的文章已经写了很多,相信看过的人还是会有一定收获的,系列文章可阅读:南瓜慢说-配置相关文章.对于@Val ...
- Roslyn 编译器Api妙用:动态生成类并实现接口
在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...
随机推荐
- BZOJ.4453.cys就是要拿英魂!(后缀数组 单调栈)
BZOJ 求字典序最大,容易想到对原串建后缀数组求\(rk\). 假设当前区间是\([l,r]\),对于在\([l,r]\)中的两个后缀\(i,j\)(\(i<j\)),显然我们不能直接比较\( ...
- mysql case when then else end 的用法
case when then end 改语句的执行过程是:将case后面表达式的值与各when子句中的值进行比较,如果两者相等,则返回then后的表达式的值,然后跳出case语 句,否则返回else子 ...
- 多轴APM飞控调参
调参步骤: 遥控器,电动机和电调对应的APM飞控连线——遥控器校准——电调行程校准——加速度计校准——磁罗盘校准——故障保护设定(遥控器和飞控)——飞行模式设定并调整——自动调参设定选项 APM飞控调 ...
- BZOJ2319 : 黑白棋游戏
将01串按1分段,那么分析可得长度为$a$的段拼上长度为$b$的段的SG值为$a-[a\leq b]$. 设$f[i][j][k][l]$表示从后往前用了$i$个1,$j$个0,当前段长度为$k$,后 ...
- shell脚本使用技巧2
0--stdin标准输入 1--stdout标准输出 2--stderr标准错误 重定向 echo "this is a good idea " > temp.txt tem ...
- ae:org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be authenticated by any configured realms. Please ensure
看问题是说要保证有一个realm正确,但是之前运行就一直成功,后来就不行了.有可能是:以为自己输入了正确的用户名和密码,结果是因为用户名前面添加了空格导致了这个错误发生. 实质问题是:你输入的用户名和 ...
- 一个label两种颜色,一个label两种字体
-(void)addLabel{ UILabel *label = [[UILabel alloc]init]; label.backgroundColor = [UIColor grayColor] ...
- 如何提高sql查询速度
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Java中Double类型的精确计算
import java.math.BigDecimal; public class DoubleUtil { private static final int DEF_DIV_SCALE = 5; / ...
- Hibernate(10)_双向n对1(双向1对n)
1.双向 1-n 与 双向 n-1 是完全相同的两种情形,这里使用双向多对一来演示 双向 1-n 需要在 1 的一端可以访问 n 的一端, 反之依然. 出版社和图书的关系:Publishers--Bo ...