Java中利用反射原理拷贝对象

测试类
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

public class Test
{
/**
* 拷贝对象方法
*/
public static Object copy(Object objSource) 
              throws IllegalArgumentException, SecurityException, InstantiationException, 
                     IllegalAccessException, InvocationTargetException,NoSuchMethodException
{
// 获取源对象类型
Class<?> clazz = objSource.getClass();
// 获取源对象构造函数
Constructor<?> construtctor = clazz.getConstructor();
// 实例化出目标对象
Object objDes = construtctor.newInstance();
// 获得源对象所有属性
Field[] fields = clazz.getDeclaredFields();
// 遍历所有属性
for (int i = 0; i < fields.length; i++)
{
// 属性对象
Field field = fields[i];
// 属性名
String fieldName = field.getName();
// 获取属性首字母
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 拼接get方法名如getName
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 得到get方法对象
Method getMethod = clazz.getMethod(getMethodName);
// 对源对象调用get方法获取属性值
Object value = getMethod.invoke(objSource);

// 拼接set方法名
String setMethodName = "set" + firstLetter + fieldName.substring(1);
// 获取set方法对象
Method setMethod = clazz.getMethod(setMethodName, new Class[] { field.getType() });
// 对目标对象调用set方法装入属性值
setMethod.invoke(objDes, new Object[] { value });
}
return objDes;
}

public static void main(String[] args) 
        throws IllegalArgumentException, SecurityException,InstantiationException,                        
                       IllegalAccessException,InvocationTargetException, NoSuchMethodException
{
// 学生源对象
Student studentSource = new Student();
studentSource.setNum(1);
studentSource.setName("xy");
studentSource.setBirthDay(new Date());

 // 复制学生对象
Student studentDes = (Student) copy(studentSource);
System.out.println(studentDes.getName());
}
}

实体类
public class Student
{
private int num;
private String name;
private Date birthDay;

public Student()
{
super();
}

public Student(int num, String name, Date birthDay)
{
super();
this.num = num;
this.name = name;
this.birthDay = birthDay;
}

public int getNum()
{
return num;
}

public void setNum(int num)
{
this.num = num;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public Date getBirthDay()
{
return birthDay;
}

public void setBirthDay(Date birthDay)
{
this.birthDay = birthDay;
}

}

注意因为在copy方法中调用的newInstance是不带参数的,所以student类中必须有空构造方法。

时间: 2025-01-21 19:08:24

Java中利用反射原理拷贝对象的相关文章

java中基本类型封装对象所占内存的大小(转)

这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runtime类中有一些简单的能涉及到内存管理的函数: Every Java application has a single instance of class Runtime that allows the application to interface with the environment in

Java中利用散列表实现股票行情的查询(转)

Java中利用散列表实现股票行情的查询 建设银行云南省保山地区分行 杨绍方 ---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的.本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法.一.散列表的原理 ---- 散列表,又称为哈希表,是线性表中一种重要的存储方式和检索方法.在散列表中,可以对节点进行快速检索.散列表算法的基本思想是:由结点的关键码值决定结点的存储地址,即以关键码值k为自变量,通过一定的函数关

《Java程序员面试秘笈》—— 面试题5 用自己的语言描述Java中的类和对象

面试题5 用自己的语言描述Java中的类和对象 下列关于对象的哪一种说法是正确的?请选择一个正确的答案. (a)对象是可以对其进行实例化从而得到类的东西. (b)对象是类的实例. (c)对象是一种蓝本,据此可以创建抽象的具体实现. (d)对象是指向属性的引用. (e)对象是一种变量. 考点:该面试题考察求职者对于Java类和对象的理解. 出现频率: [面试题解析] 1.类 在处理复杂事物的时候,用到的一种基本手段就是抽象.抽象的目的就是区别事物之间的本质和不同,面向对象编程(OOP)的实质就是利

第三方dll文件-Java中利用jawin调用dll文件,invoke的参数问题

问题描述 Java中利用jawin调用dll文件,invoke的参数问题 各位大神: dll中的被调用方法如下: long WINAPI AutoOpenComPort(long* Port, unsigned char *ComAdr, unsigned char Baud,long *FrmHandle); 其中: Port:输出变量, ComAdr:输入/输出变量 Baud:输入变量 FrmHandle:输出变量 请问它的 msgBox.invoke(instructions, stack

java中利用反射调用另一类的private方法的简单实例_java

我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:  import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo

Java中利用Reflection API优化代码

摘要 开发者通过各种各样的方法来尝试避免单调冗余的编程.一些编程的规则例如继承.多态或者设计模型可以帮助开发者避免产生多余的代码.不过由于软件开发方面存在着不确定性,因此这些规则并不能消除代码维护和重新编写的需要.在很多时候维护都是不可避免的,只有不能运作的软件才是从不需要维护的.不过,这篇文章介绍了你可以使用Java的Reflection API的功能来减少单调的代码编写,并可以使用活动的代码产生来克服reflection的限制. 数据配置(由外部的源头得到数据并且将它装载到一个Java对象中

Java中利用接口实现回调

在 Java 支持方法指针之前,Java 接口不能提供一种实现回调的好方法.如果您习惯于传递在事件驱动编 程模型中调用的函数指针,则您会喜欢本技巧. 熟悉 MS-Windows 和 X Window System 事件驱动编程 模型的开发人员,习惯于传递在某种事件发生时调用(即"回调")的函数指针.Java 的面向对象模型目前 并不支持方法指针,这样似乎就不可能使用这种很好的机制.但我们并不是一点办法都没有! Java 的接 口支持提供了一种获得回调的等价功能的机制.其技巧就是:定义一

Java中利用JCOM实现仿Excel编程

在JAVA中使用JCOM和JXL注意要点: (1)在你的lib下要有jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.jar,jcom.dll. (2)要把jcom.dll同时放到你JDK的bin目录下或者放到系统盘的windows下(推荐放到JDK的BIN下) 把上面的JAR包都放好后开始写应用中的工具类(申明一下在JCOM中得到的都是IDispatch对象,以下还会抛出一个JComException的异常) (1)首先应该判断一个传进来的路径是Word 或是 Exc

Java中利用Either和Option进行函数式错误处理

在本期 函数式思维 的文章中,将探讨在以函数方式显示 Java 错误的同时仍保留类型安全的方法,说明如何通过函数式返回来包装经过检查的异常,并介绍一个方便的抽象,其名称为 Either. 当您研究函数式编程等深奥学科时,令人着迷的分支偶尔会出现.在 函数式思维:函数设计模式,第 3 部分 中,我在迷你系列中继续以函数的方式重新思考传统的 Gang of Four 设计模式.在下一期文章中,我将回到这一主题,讨论 http://www.aliyun.com/zixun/aggregation/16