公司的项目是用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. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  2. [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:

    [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子: mydf001=sqlContext.read.format("jdbc").o ...

  3. ABP从入门到精通(5):.扩展国际化语言资源

    ABP的有些组件使用的该组件自带的语言包资源,所以在有些时候会因为我们当前使用的语言对应的语言包不全,而造成日志一直记录WARN.ABP给我们提供了扩展语言包资源的接口,可以解决这个问题. 以下示例代 ...

  4. 从Stampery到Chronicled,区块链公证业务的实践

    Stampery就是这样一家利用比特币区块链技术代替公证人的创业公司,能为所有的敏感文件提供具有法律约束力的证明.可以用Stampery证明任何文件,它能很好地保护知识产权,证明遗嘱.宣誓.合同.家庭 ...

  5. c#代码分析

    代码分析是在一个IT行业计算机程序员必须要具有的基本专业技能,在了解一定的专业基础之上去看懂别人编写的代码,分析别人代码实现的功能,以及基本的维护和扩展测试.不同的人有不同的代码风格,要使自己的能要别 ...

  6. Jquery画折线图、柱状图、饼图

    1.今天做了一个折线图,首先需要导js文件.这里有一个demo:http://files.cnblogs.com/files/feifeishi/jquery_zhexiantubingtuzhuzh ...

  7. github个人心得和链接

    github使用心得: 在本次github使用过程中,我总结了git常用命令,都有哪些功能? git常用命令: git config :配置git git add:更新working director ...

  8. 利用ThreadLocal管理事务

    package com.itheima.util; import java.sql.Connection; import java.sql.SQLException; //封装了所有与事务有关的方法 ...

  9. 重载(overload)、覆盖(override)、隐藏(hide)的区别

    http://blog.csdn.net/yanjun_1982/archive/2005/09/02/470405.aspx 重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同.调用的 ...

  10. Spring注解 开发