刚刚完成一个WEB SERVICE的项目,其中用到了安全方面的东西,传送前要用DES加密,我只能把对象中的每条属性都转换成字节数组,然后加密,最后传送到服务端。。
怎么能把对象A里20多个字段转成字节数组并复制到对象B中呢(对象A中都是Integer类型,对象B中都是字节数组型的类型,属性名称和A中相同,都有getter和setter方法)
首先想到了beanutils的用法,但这个类不可以转换类型啊?于是,自己写了一个类,来实现上面的需求。
Converter类 代码
- /**
- * 实现两个实例对象之间的对拷,并转换obj1数据类型为byte数组到obj2
- * obj1 转化前的OBJ
- * obj2 转化后的OBJ
- */
- public static void convertToByte(Object obj1,Object obj2) {
- //对obj1反射
- Class obj1Class=obj1.getClass();
- Method[] obj1methods=obj1Class.getDeclaredMethods();
- //对obj2反射
- Class obj2Class=obj2.getClass();
- Method[] obj2methods=obj2Class.getDeclaredMethods();
- // 把obj2的方法影射到MAP中,方便调用
- Map obj2MeMap=new HashMap();
- for(int i=0;i<obj2methods.length;i++)
- {
- Method method=obj2methods[i];
- obj2MeMap.put(method.getName(),method);
- }
- //利用输入输出流实现类型转换
- ByteArrayOutputStream bo = new ByteArrayOutputStream();
- for(int i=0;i<obj1methods.length;i++)
- {
- String methodName=obj1methods[i].getName();
- if(methodName!=null&&methodName.startsWith("get"))
- {
- //取得对象里的FIELD
- try{
- //调用obj1实例中的getXXXX方法
- Object returnObj=obj1methods[i].invoke(obj1, new Object[0]);
- //利用输入输出流将对象转换成对应的byte数组
- ObjectOutputStream oo = new ObjectOutputStream(bo);
- oo.writeObject(returnObj);
- byte[] bytes = bo.toByteArray();
- //DES加密 encryptField对字节码加密
- byte[] encryptbytes = encryptField(bytes);
- //把加密后的字节码放入obj2对应的域中
- Method obj2method=(Method)obj2MeMap.get("set"+methodName.split("get")[1]);
- //调用obj2实例中的setXXX方法
- obj2method.invoke(obj2, encryptbytes);
- }catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- }
利用JAVA反射机制可以动态获得对象实例的类型信息,比如得到对象中定义的方法,并可以调用这些方法,实现属性的拷贝
本方法还用到了将一个JAVA对象转换成字节数组的方法:利用输入输出流 ByteArrayOutputStream --ObjectOutputStream
将字节数组转换成对应的对象,要用到:ByteArrayInputStream ObjectInputStream
字节数组转换成对象 代码
- // DES解密
- byte[] decryptedByte =decryptField(returnByte);
- ByteArrayInputStream bi = new ByteArrayInputStream(decryptedByte);
- ObjectInputStream oi = new ObjectInputStream(bi);
- Integer inteObj = (Integer)oi.readObject();
- //放入obj2对应的域中
- Method obj2method=(Method)obj2MeMap.get("set"+methodName.split("get")[1]);
- obj2method.invoke(obj2, inteObj);