用例场景:在一个商户管理系统中,操作人员对一个已注册的商户进行修改,这就触发了一个商户修改的工作流,修改提交后,修改的商户信息和原商户信息会传递到审核人员的窗口进行审核,审核完毕后,新商户信息更新,同时旧商户信息去到历史库。
数据库:我们这里有三张表——BusiInfo,BusiInfo_hist,BusiInfo_ba。BusiInfo是商户信息表存放经过注册的商户信息;BusiInfo_hist是商户信息历史表,将修改完成后的商户原信息保存到此处;BusiInfo_ba是商户信息在途表,保存并未审核通过的修改后信息,当审核通过后转移到_hist历史表,并将在途信息删除。
例子:比如商户信息为a,现在修改为b,我们看看各表中的数据如何变化。
修改前
修改中
修改后
BusiInfo
a
a
b
BusiInfo_ba
b
BusiInfo_hist
a
好,现在我们开始编码,我们采用的是hibernate,通常的做法是每个表对应一个javabean,当信息在不同表中进行转移的时候,通常的做法是将先一个javabean中的信息一个一个getMessage(),然后再一个一个setMessage()到另一个javabean中。如果属性很多的话这是一个体力活,同时如果以后有新增属性的话,还要回来维护这个传值的方法。
我们决定找到一个一劳永逸的方法来解决这类问题。这里我们用到了java继承和反射机制。
Java代码  
package com.mytesta;  
/** 
* 商户信息类,父类 
*/  
public class BusiInfoIn {  
public String busiId;  
public String busiLoginname;  
public Long number;  
public Long getNumber() {  
return number;  
}  
public void setNumber(Long number) {  
this.number = number;  
}  
public String getBusiId() {  
return busiId;  
}  
public void setBusiId(String busiId) {  
this.busiId = busiId;  
}  
public String getBusiLoginname() {  
return busiLoginname;  
}  
public void setBusiLoginname(String busiLoginname) {  
this.busiLoginname = busiLoginname;  
}  
}  
Java代码  
package com.mytesta;  
/** 
* 商户历史信息类,子类,同理可建立商户在途信息类 
*/  
public class BusiInfoIn_his extends BusiInfoIn {  
public String deleteDate;  
public String getDeleteDate() {  
return deleteDate;  
}  
public void setDeleteDate(String deleteDate) {  
this.deleteDate = deleteDate;  
}  
}  
Java代码  
package com.mytesta;  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
import junit.framework.TestCase;  
public class BusiInfoTest extends TestCase {  
public void test() throws Exception {  
//  
BusiInfoIn_his busiInfoIn_his=new BusiInfoIn_his();  
busiInfoIn_his.setBusiId("1243124");  
busiInfoIn_his.setBusiLoginname("jeffen");  
busiInfoIn_his.setDeleteDate("2009-1-1");  
BusiInfoIn busiInfo =new BusiInfoIn();  
busiInfo=(BusiInfoIn)busiInfoIn_his;  
System.out.println("子类传父类=============================");  
System.out.println(busiInfo.getBusiId());  
System.out.println(busiInfo.getBusiLoginname());  
BusiInfoIn busiInfo2 =new BusiInfoIn();  
busiInfo2.setBusiId("09090909");  
busiInfo2.setBusiLoginname("runrun");  
busiInfo2.setNumber(11L);  
BusiInfoIn_his busiInfoIn_his2=new BusiInfoIn_his();  
this.fatherToChild(busiInfo2, busiInfoIn_his2);  
System.out.println("父类传子类=============================");  
System.out.println(busiInfoIn_his2.getBusiId());  
System.out.println(busiInfoIn_his2.getBusiLoginname());  
System.out.println(busiInfoIn_his2.getNumber());  
System.out.println(busiInfoIn_his2.getDeleteDate());  
}  
/* 
* 将父类所有的属性COPY到子类中。 
* 类定义中child一定要extends father; 
* 而且child和father一定为严格javabean写法,属性为deleteDate,方法为getDeleteDate 
*/  
private void fatherToChild (Object father,Object child)throws Exception{  
if(!(child.getClass().getSuperclass()==father.getClass())){  
throw new Exception("child不是father的子类");  
}  
Class fatherClass= father.getClass();  
Field ff[]= fatherClass.getDeclaredFields();  
for(int i=0;i<ff.length;i++){  
Field f=ff[i];//取出每一个属性,如deleteDate  
Class type=f.getType();  
Method m=fatherClass.getMethod("get"+upperHeadChar(f.getName()));//方法getDeleteDate  
Object obj=m.invoke(father);//取出属性值               
f.set(child,obj);  
}  
}  
/** 
* 首字母大写,in:deleteDate,out:DeleteDate 
*/  
private String upperHeadChar(String in){  
String head=in.substring(0,1);  
String out=head.toUpperCase()+in.substring(1,in.length());  
return out;  
}  
}  
我们可以看到子类比父类多了一个属性deleteDate,代表进入历史表的时间。上面的运行结果如下
Java代码  
子类传父类=============================  
1243124  
jeffen  
父类传子类=============================  
09090909  
runrun  
11  
null  
可以看到只要我们的持久类采用标准的javabean格式,子类从父类拷贝属性信息一步完成,而且不受以后属性增减的影响。

转载于:https://www.cnblogs.com/huapox/archive/2013/05/01/3516088.html

利用java反射机制,子类从父类拷贝属性--解决信息修改类设计的模式相关推荐

  1. java反射获取子类或者父类的属性值

    方法介绍 1.获取所有属性 private static List<Field> getAllField(Class<?> class1){List<Field> ...

  2. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  3. 利用Java反射机制调用类的私有方法

    利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...

  4. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  5. 利用java反射机制进行对象操作

    我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...

  6. java invoke 泛型_利用Java反射机制和泛型,全自动解析json

    有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去 ...

  7. 利用Java反射机制调用含数组参数的方法

    http://yourmitra.wordpress.com/2008/09/26/using-java-reflection-to-invoke-a-method-with-array-parame ...

  8. 利用Java反射机制降低代码圈复杂度

    利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...

  9. 利用java反射机制修改属性值

    利用java反射机制修改属性值 本文将介绍如何利用java反射机制修改属性值,废话不多说,直接上代码 1.新建一个实体类,添加属性test以及获取属性值的方法getTest() public clas ...

最新文章

  1. html在页面上div绝对定位,html – 中心浮动div在绝对定位div内
  2. NETSTAT日常应用归档
  3. JVM CPU Profiler技术原理及源码深度解析
  4. 统计消息总数_和公牛一战,库里创三个记录,耀眼的还是三分球总数
  5. 音视频技术开发周刊:FFmpeg内置的一个无中生有的音视频输入数据 | 214
  6. 专访快手传输算法负责人周超博士:LAS标准的推出离不开信念感
  7. VS code 搭建Vue 项目
  8. 剑指offer 面试32题
  9. 如何将自定义消息添加到Mac锁屏
  10. 计算机导论电子版_程序员进阶系列:拿下中科大的计算机课程全靠它了!
  11. 文件扩展名(后缀名)是什么?win10怎么显示扩展名?
  12. MySQL基础学习(尚硅谷 婷姐)自学笔记_001
  13. 华三防火墙应用二层和三层的配置实例
  14. 喜讯 雨笋教育优秀学员荣获望城区网络安全攻防演练二等奖
  15. Could not publish server configuration for Tomcat v8.0 Server at localhost.
  16. 关于网站目录结构需要注意的地方
  17. redis安装和启动
  18. com.android.sr已停止,DCS-SDK(java)运行于Android4.4.2版本退出时提示程序停止运行
  19. SQL超级详细的使用教程
  20. VBA几个常用的模块

热门文章

  1. 《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题...
  2. 吴恩达机器学习笔记-应用机器学习的建议
  3. VIPER 和 MVVM 到底有什么区别
  4. Windows Server 2008 R2之三十二:证书注册WEB服务(一)
  5. 【SQL学习笔记】一、select语句
  6. Android开发将List转化为JsonArray和JsonObject
  7. 当手机淘宝遇见海尔电商
  8. php-fpm定义成集群资源时报错解决方法
  9. Android移动端音视频的快速开发教程(十)
  10. 武汉东方7神话服饰有限公司