公司的项目是用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. Luogu P2048 [NOI2010]超级钢琴

    这道题题号很清新啊!第一次开NOI的题,因为最近考到了这道题的升级版. 我们先考虑\(O(n^2)\)大暴力,就是枚举前后端点然后开一个前缀和减一下即可. 然后引入正解,我们设一个三元组\(F(s,l ...

  2. [Oracle]快速生成大量模拟数据的方法

    快速生成大量模拟数据的方法: create table TEST(id integer, TEST_NUMBER NUMBER(18,6)); insert into TEST select i+j, ...

  3. Bluedroid 函数分析:BTA_GATTC_Open

    进行GATT 通信,首先要打开GATT 的通道.下面我们分析BTA_GATTC_Open 这个函数: 这个函数在bta_gattc_api.c 文件中定义,这个是一个接口文件,里面没有做真正的open ...

  4. Http指南(3)

    Web主机托管 主机托管服务 虚拟主机托管:许多Web托管者通过让一些顾客共享一台计算机来提供便宜的Web主机托管服务.这称为共享主机托管或虚拟主机托管 虚拟服务器请求缺乏主机信息: 不幸的是,HTT ...

  5. Adobe Photoshop CC 2015使用及扩展工具

    VAdobe Photoshop CC 2015: 简称"PS",是由Adobe Systems开发和发行的图像处理软件 扩展工具: Cuuterman:切图插件: 一个一个切图, ...

  6. Python小笔记

    最近在学习Python  以前也学过一些编程语言 但是都不扎实  由于工作的原因 需要学习Python做一些处理 刚开始学习总有多多少少的不适应  从今天开始打算将我在学习中遇到的困难以及疑问记录下来 ...

  7. github更新,发布地址,燃尽图,总结

    github地址:https://github.com/Lingchaoyang 网盘发布地址:http://pan.baidu.com/s/1qXgHiyC 燃尽图: 团队得分(100分制): 杨灵 ...

  8. windows、ubuntu、centos7下mysql 的安装与使用

    一.windows 及ubuntu下安装 windows可以傻瓜式安装,另一种空闲了下来写,也不麻烦 ubuntu: apt-get install mysql 强烈推荐使用ubuntu从这儿就很方便 ...

  9. Flask-论坛开发-2-Jinja2模板

    对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. Jinja2 模板介绍 ...

  10. HTML 5 placeHolder

    <html> <body> <input type="text" id="idNum" placeholder="pla ...