利用JAVA 反射机制实现对象的域类型的转换和拷贝

刚刚完成一个WEB SERVICE的项目,其中用到了安全方面的东西,传送前要用DES加密,我只能把对象中的每条属性都转换成字节数组,然后加密,最后传送到服务端。。

怎么能把对象A里20多个字段转成字节数组并复制到对象B中呢(对象A中都是Integer类型,对象B中都是字节数组型的类型,属性名称和A中相同,都有getter和setter方法)

首先想到了beanutils的用法,但这个类不可以转换类型啊?于是,自己写了一个类,来实现上面的需求。

Converter类 代码
  1. /**    
  2.      * 实现两个实例对象之间的对拷,并转换obj1数据类型为byte数组到obj2    
  3.      * obj1 转化前的OBJ    
  4.      * obj2 转化后的OBJ    
  5.      */     
  6.     public static void convertToByte(Object obj1,Object obj2) {      
  7.         //对obj1反射      
  8.         Class obj1Class=obj1.getClass();      
  9.         Method[] obj1methods=obj1Class.getDeclaredMethods();      
  10.         //对obj2反射      
  11.         Class obj2Class=obj2.getClass();      
  12.         Method[] obj2methods=obj2Class.getDeclaredMethods();      
  13.               
  14. //      把obj2的方法影射到MAP中,方便调用      
  15.         Map obj2MeMap=new HashMap();      
  16.         for(int i=0;i<obj2methods.length;i++)      
  17.         {      
  18.             Method method=obj2methods[i];      
  19.             obj2MeMap.put(method.getName(),method);      
  20.         }      
  21.         //利用输入输出流实现类型转换      
  22.         ByteArrayOutputStream bo = new ByteArrayOutputStream();      
  23.               
  24.         for(int i=0;i<obj1methods.length;i++)      
  25.         {      
  26.             String methodName=obj1methods[i].getName();      
  27.             if(methodName!=null&&methodName.startsWith("get"))      
  28.             {      
  29.                 //取得对象里的FIELD      
  30.                 try{      
  31.                     //调用obj1实例中的getXXXX方法   
  32.                     Object returnObj=obj1methods[i].invoke(obj1, new Object[0]);      
  33.                     //利用输入输出流将对象转换成对应的byte数组      
  34.                     ObjectOutputStream oo = new ObjectOutputStream(bo);      
  35.                     oo.writeObject(returnObj);      
  36.                     byte[] bytes = bo.toByteArray();      
  37.                     //DES加密   encryptField对字节码加密   
  38.                     byte[] encryptbytes = encryptField(bytes);      
  39.                     //把加密后的字节码放入obj2对应的域中      
  40.                     Method obj2method=(Method)obj2MeMap.get("set"+methodName.split("get")[1]);      
  41.                     //调用obj2实例中的setXXX方法   
  42.                     obj2method.invoke(obj2, encryptbytes);      
  43.                 }catch(Exception e)      
  44.                 {      
  45.                     e.printStackTrace();      
  46.                 }      
  47.             }      
  48.         }      
  49.     }     

利用JAVA反射机制可以动态获得对象实例的类型信息,比如得到对象中定义的方法,并可以调用这些方法,实现属性的拷贝

本方法还用到了将一个JAVA对象转换成字节数组的方法:利用输入输出流 ByteArrayOutputStream --ObjectOutputStream

将字节数组转换成对应的对象,要用到:ByteArrayInputStream ObjectInputStream

字节数组转换成对象 代码
  1. //                  DES解密   
  2.                     byte[] decryptedByte =decryptField(returnByte);   
  3.                     ByteArrayInputStream bi = new ByteArrayInputStream(decryptedByte);   
  4.                     ObjectInputStream oi = new ObjectInputStream(bi);   
  5.                     Integer inteObj = (Integer)oi.readObject();   
  6.                     //放入obj2对应的域中   
  7.                     Method obj2method=(Method)obj2MeMap.get("set"+methodName.split("get")[1]);   
  8.                     obj2method.invoke(obj2, inteObj);  

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值