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

用例场景:在一个商户管理系统中,操作人员对一个已注册的商户进行修改,这就触发了一个商户修改的工作流,修改提交后,修改的商户信息和原商户信息会传递到审核人员的窗口进行审核,审核完毕后,新商户信息更新,同时旧商户信息去到历史库。

数据库:我们这里有三张表——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

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格式,子类从父类拷贝属性信息一步完成,而且不受以后属性增减的影响。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值