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

news/2024/7/5 5:22:10

测试类

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类中必须有空构造方法。

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1385523如需转载请自行联系原作者


woshixuye111


http://www.niftyadmin.cn/n/3860007.html

相关文章

SSIS的一个问题

先前在VS2005中创建SSIS包一切正常&#xff0c;可能是什么时候更新系统组件时有问题&#xff0c;前几天打开来想要做一个包&#xff0c;却总是报告说“无法创建包&#xff0c;找不到接口” 经查找&#xff0c;下面这个链接可以解决这个问题&#xff0c;但不知道为什么会这样 ht…

Flex及AS3的百条常用知识(转载)

Flex及AS3的百条常用知识(转载) 找资料的时候 看到一篇文章很实用 对新手的基本问题都可以找到&#xff0c;方便查找答案的时间 【改变输出swf的尺度,背景颜色或帧频】 在"Navigator"窗框里右键你的项目>选中"Properties">选中"ActionScript Co…

php写入redis并设置过期时间,redis需要设置过期时间吗

memcached一般都设置expire过期了自动删除&#xff0c;然后$arr $mem->get($key);if(empty($arr)){$sql "select ....";$arr $pdo->fetch();$mem->set($key,$arr,10*60);}redis的PHP API只有一个setex设置过期时间&#xff0c;其他的list&#xff0c;zse…

逐渐增高_长高运动,运动增高的机理

接下来我们讲一下运动增高的机理&#xff0c;简单来说&#xff0c;运动训练过程中所进行的各种身体的练习&#xff0c;从生理学的角度来看&#xff0c;都是外界环境对我们身体的刺激&#xff0c;而这种刺激会使得身体产生适应后呢&#xff1f;身体的机能&#xff0c;还有形态就…

ElasticSearch:剖析query_and_fetch和query_then_fetch的区别

转自&#xff1a;http://blog.csdn.net/caipeichao2/article/details/46418413

Request-Line解释

Request-Line Method SP Request-URI SP HTTP-Version CRLF Method有7种: GET检索URI中标识资源的一个简单请求 HEAD与GET方法相同&#xff0c;服务器只返回状态行和头标&#xff0c;并不返回请求文档 POST服务器接受被写入客户端输出流中的数据的请求 PUT服务器保存请求数据作…

车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序讲解模板).doc...

文档介绍&#xff1a;learcloseallIimread(chepai.jpg);subplot(3,2,1);imshow(I),title(原始图像);I_grayrgb2gray(I);subplot(3,2,2),imshow(I_gray),title(灰度图像);%形态学预处理I_edgeedge(I_gray,sobel);subplot(3,2,3),imshow(I_edge),title(边缘检测后图像);se[1;1;1]…

Mysql中的临时表使用方法讲解

当工作在非常大的表上时&#xff0c;你可能偶尔需要运行很多查询获得一个大量数据的小的子集&#xff0c;不是对整个表运行这些查询&#xff0c;而是让MySQL每次找出所需的少数记录&#xff0c;将记录选择到一个临时表可能更快些&#xff0c;然后多这些表运行查询。 创建临时表…