论坛首页 Java企业应用论坛

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

浏览 8269 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-29  
SOA

刚刚完成一个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);  

 

   发表时间:2007-08-29  
实现Externalizable不可以么?
0 请登录后投票
   发表时间:2007-08-31  
能帖出代码么?
    不知道这是什么东东。。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics