公司的项目是用webservice来进行前后台对接,启动后台后需要刷服务才能在前台生成对应的代码,但是有一个很恶心的地方,它给每个service都生成了一个model,于是出现后台只有一个javabean,前台生成的代码却有好几个,十几个相同的javabean,唯一的不同是包名的不同.

于是就有了一种需求,将一个javabean转化为另一个javabean,明明两个类一模一样,但是因为参数问题,却不得不转,比如工作流那块,就出现了类似这样的代码:

写了这么长的代码其实啥也没干,就将两个javabean赋值了一下,这样的代码本来就够恶心的了,更恶心的是项目中所有用到工作流的前台窗体中都出现了类似这样的一段代码,

唯一不同就是不同的窗体中对应的包名有区别而已.有强迫症的我终于受不了了,今天有时间用反射写了一段代码,将一个javabean转化成两个javabean,以后只要直接调用就行了

代码如下:

 /**
* 将一个对象转换为另一个对象
* @param <T1> 要转换的对象
* @param <T2> 转换后的类
* @param orimodel 要转换的对象
* @param castClass 转换后的类
* @return 转换后的对象
*/
public static <T1,T2> T2 convertBean(T1 orimodel, Class<T2> castClass) {
T2 returnModel = null;
try {
returnModel = castClass.newInstance();
} catch (Exception e) {
throw new RuntimeException("创建"+castClass.getName()+"对象失败");
}
List<Field> fieldlist = new ArrayList<Field>(); //要转换的字段集合
while (castClass != null && //循环获取要转换的字段,包括父类的字段
!castClass.getName().toLowerCase().equals("java.lang.object")) {
fieldlist.addAll(Arrays.asList(castClass.getDeclaredFields()));
castClass = (Class<T2>) castClass.getSuperclass(); //得到父类,然后赋给自己
}
for (Field field : fieldlist) {
PropertyDescriptor getpd = null;
PropertyDescriptor setpd = null;
try {
getpd= new PropertyDescriptor(field.getName(), orimodel.getClass());
setpd=new PropertyDescriptor(field.getName(), returnModel.getClass());
} catch (Exception e) {
continue;
}
try {
Method getMethod = getpd.getReadMethod();
Object transValue = getMethod.invoke(orimodel);
Method setMethod = setpd.getWriteMethod();
setMethod.invoke(returnModel, transValue);
} catch (Exception e) {
throw new RuntimeException("cast "+orimodel.getClass().getName()+"to "
+castClass.getName()+" failed");
}
}
return returnModel;
}

刚开始的转化没有包括父类的字段转化,所以在项目中使用报了错,转化后的对象没有父类的字段值,后来优化成了将所有父类的字段一起转化了.

刚开始也只针对工作流进行了转化,后来又优化了一下,使用了泛型,也使得适用性更广,现在支持两个任意的javabean相互转换,将两个javabean中的相同字段相互赋值,不同字段就直接跳过.

不知道方法还有没有啥问题哈,我只进行了简单的自测.应该没啥大问题

好吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以实现两个javabean之间的相互拷贝,自己写的就当是研究咯

java将一个javabean转化为另一个javabean的更多相关文章

  1. java将一个List赋值给另一个List

    声明和实例化: 声明:ArrayList a, 仅仅只是声明了一个list变量,其未来作用相当于C++中的引用变量,亦或者相当于一个对象块的索引,但并未为其分配具体的完整的对象所需要的内存空间,其所分 ...

  2. 把javabean复制到另一个javabean 使用BeanUtils.copyProperties(a,b) 复制

    该方法对于两种不同的jar包有两种不同的意义 ,a,b通常是两个结构相似的javabean,注意:a,b里的定义类型名称必须一致才能复制 引用的是org.springframework.beans 则 ...

  3. java将一个List赋值给另一个List的4种方法

    编辑 删除 声明:ArrayList a, 仅仅只是声明了一个list变量,其未来作用相当于C++中的引用变量,亦或者相当于一个对象块的索引,但并未为其分配具体的完整的对象所需要的内存空间,其所分配的 ...

  4. C结构体与JavaBean转化

    1 概述 (1)项目开发过程可能涉及多种语言,而多种语言之间如何数据交换格式是多种多样的,比如说:Java和JavaScript可以用json,Java和C#可以用xml等等. (2)这里提供一种C与 ...

  5. Eclipse快速生成一个JavaBean类的方法

    原文: https://jingyan.baidu.com/article/948f5924156866d80ff5f921.html Eclipse快速生成一个JavaBean类的方法 听语音 | ...

  6. 一个JavaBean和DTO转换的优秀案例

    所有的JavaBean和DTO的互相转换接口,JavaBean转化成DTO或者DTO转换JavaBean: public abstract class Converter<A, B> { ...

  7. 通过反射将一个java对象的属性值转换为一个Map

    将一个java对象的属性值转换为一个Map: import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.P ...

  8. JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)

    接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...

  9. JavaBean+Servlet 开发时,JavaBean 编写问题

    在开发 JavaBean 时,遇见一个问题: *****  表单字段为空,提交时出现 nullPointerException 异常:  表单字段不为空,提交正常. 使用 JavaBean ,JSP页 ...

随机推荐

  1. Bootstrap Search Suggest 下拉框模糊查询

    源码地址:https://github.com/lzwme/bootstrap-suggest-plugin 有时间会完善!暂时有点忙!

  2. [Oracle]Master表字段扩张时的对应方法

    Master表字段扩张时的对应方法 如果Master表的数据量很大,Master表中的列,宽度扩张了,MVIEW表如何对应处理? 此时,重建MVIEW可能会耗费很长的时间. 可以采用 alter ma ...

  3. openMP多线程编程

    OpenMP(Open Muti-Processing) OpenMP缺点: 1:作为高层抽象,OpenMp并不适合需要复杂的线程间同步和互斥的场合: 2:另一个缺点是不能在非共享内存系统(如计算机集 ...

  4. 分布式监控系统Zabbix3.4-钉钉告警配置记录

    群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.例如:通过聚合GitHub,GitLab等源码管理服务,实现源码更新同步:通过聚合Trello,JIR ...

  5. confluence上传文件附件预览乱码问题(linux服务器安装字体操作)

    在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...

  6. B. Vova and Trophies

    链接 [https://codeforces.com/contest/1082/problem/B] 题意 给你一个包含GS的字符串,只允许交换一次任意不同位置的字符,问最长的连续G串是多少 分析 很 ...

  7. M2事后分析

    计划 1. 你原计划的工作是否最后都做完了? 如果有没做完的,为什么? 修复了M1阶段的bug,整合前两组的数据.扩充功能,和学霸组达成功能上的一致,对数据库进行信息的完善. 2. 有没有发现你做了一 ...

  8. Linux内核读书笔记第六周

    主要内容: 什么是调度 调度实现原理 Linux上调度实现的方法 调度相关的系统调用 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上 ...

  9. 使用docker安装paddlepaddle 和 tensorflow

    1.tensorflow安装 http://blog.csdn.net/freewebsys/article/details/70237003 (1)拉取镜像:docker pull tensorfl ...

  10. Daily Scrum - 12/15-21

    Meeting Minutes 没有什么实质性进展: 添加/完成了一个新feature,即使用非线性的函数作为速度条的设定: 等待与travis开会,讨论下一步的feature = =: 阅读code ...