`
flash59
  • 浏览: 97740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用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);  

 

分享到:
评论
2 楼 flash59 2007-08-31  
能帖出代码么?
    不知道这是什么东东。。。。
1 楼 likeblood 2007-08-29  
实现Externalizable不可以么?

相关推荐

    java反射机制创建对象实现:java 深度拷贝 -超完美

    在给定的标题和描述中,我们关注的是如何利用反射机制来实现对象的深度拷贝。深度拷贝是指创建一个与原对象完全独立的新对象,包括所有嵌套对象的副本。以下将详细解释如何通过反射和序列化来实现这一目标。 首先,...

    BeanConvertor工具类Java开发Bean转换拷贝工具类

    内容概要:本资源提供了一个Java Bean转换工具类示例,展示了如何使用反射和JSON序列化实现对象之间的属性拷贝。该工具类包含两个主要方法:convertTo和convertByJackson,前者基于反射用于结构相同的对象间的属性...

    拷贝JSON对象值进Java Bean对象

    这段代码利用了反射机制,找到Java Bean类中的setter方法,根据JSON中的键值对调用setter方法设置属性值。 另一种常见的方式是使用Gson库,它的使用更加简洁。首先,引入Gson库,然后使用`Gson.fromJson()`方法进行...

    JAVA创建对象的四种方法

    -java 创建对象的四种方法是指在 Java 中创建对象的不同方式,它们分别是使用 new 语句创建对象、使用反射机制创建对象、使用 clone() 方法创建对象和使用反序列化机制创建对象。 - 使用 new 语句创建对象是 Java ...

    java反射以及复制一个bean的值到另一个bean中。

    总之,Java反射提供了一种强大的机制,允许我们在运行时检查和操作类和对象。它在许多场景下非常有用,比如框架开发、动态代理、序列化、元数据操作等。同时,复制bean的值也是常见的需求,尤其在数据处理和对象模型...

    反射拷贝属性

    在Java编程语言中,"反射拷贝属性"是一种利用反射机制来复制对象属性的技术。反射是Java提供的一种强大工具,允许程序在运行时检查和操作类、接口、字段和方法等对象。通过反射,我们可以动态地获取类的信息并操作类...

    Java 细数浅拷贝和深拷贝

    除了通过实现`Cloneable`接口和利用序列化机制外,还可以通过以下方式实现拷贝: - 使用Java反射API来复制对象。 - 使用Apache Commons Lang库中的`BeanUtils.copyProperties`方法。 - 使用第三方库如Guava提供的...

    通过构造及反射实现类属性赋值

    标题中的“通过构造及反射实现类属性赋值”涉及到的技术是Java的构造函数和反射机制。这两种方法在特定场景下能帮助我们更灵活、更深入地处理对象属性的复制。 首先,构造函数是创建新对象时调用的特殊方法,它可以...

    利用annotation完成对象间的属性拷贝

    在Java开发中,对象间的属性拷贝是一个常见的需求,特别是在数据转换、模型绑定或服务调用等场景。本文将深入探讨如何利用注解(Annotation)来实现这一功能,以提高代码的可读性和可维护性。我们将从标题“利用...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    ### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。

    java最新面试题50道精讲

    总之,这些面试题涵盖了Java的核心概念和技术,包括对象克隆、多态性、异常处理、集合框架、泛型、多线程、反射、注解、数据类型和内存管理等,这些都是成为一名合格的Java开发者必须掌握的知识点。

    java笔记 java笔记

    ### Java基础知识概述 #### 1. 前言 Java是一种广泛使用的面向对象的编程语言,因其跨平台性、安全性和强大的功能而受到欢迎。...掌握这些核心概念和技术将有助于开发者更好地利用Java来解决问题。

    java面试100题,包含java基础等

    本文将对 Java 中的访问修饰符、运算符、垃圾回收机制、自动装箱和自动拆箱、类加载机制、异常层次结构、接口和抽象类、内部类、深拷贝和浅拷贝、String、StringBuilder 和 StringBuffer、集合框架、泛型、反射、...

    详解Java中Object 类的使用.rar

    4. **深拷贝与浅拷贝**:虽然Object类不直接提供拷贝功能,但它的`clone()`方法可以实现对象的复制。不过,`clone()`默认是浅拷贝,如果对象中包含复杂数据结构(如数组或引用其他对象),需要自行处理以实现深拷贝...

    2014年Java最全面试题以及答案.

    Java中实现多态的机制主要依赖于继承和接口,多态性表现为方法的重载和重写。 35. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 垃圾回收器的基本原理是...

    Java 基础核心总结 +经典算法大全.rar

    节点流和处理流 Java IO 的核心类 File Java IO 流对象 字节流对象InputStream OutputStream 字符流对象Reader Writer 字节流与字符流的转换新潮的 NIO 缓冲区(Buffer)通道(Channel) 示例:文件拷贝案例 BIO 和 NIO ...

    Java面试题答案2023

    Java 中的动态代理是通过反射机制实现的,它可以在运行时动态地生成代理类,并将代理类的方法调用转发给被代理的对象。 二十二、Lambda 表达式 Java 中的 Lambda 表达式是一种简洁的函数式编程语法,它可以用来...

    CoreJava学习笔记

    Java中可以使用Serializable接口来实现对象的序列化和反序列化。 **I/O流基础:** Java中I/O流用于处理输入输出操作,包括文件、网络等。 **流的分类:** 流可以分为字节流和字符流两大类。 **I/O输入输出:** ...

Global site tag (gtag.js) - Google Analytics