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


目录
相关文章
|
7月前
|
设计模式 Java
Java中创建对象的方式
Java中创建对象的方式
59 5
|
6月前
|
Java
Java创建对象有几种方式
Java创建对象有几种方式
29 1
|
6月前
|
安全 Java
Java 对象创建与使用:你真的会用吗?
【6月更文挑战第15天】在Java中,对象创建涉及`new`关键字和构造器,用于初始化。使用对象时注重属性和方法的访问,遵循命名规范。关注对象生命周期,避免过度创建,如在循环内,以减少内存消耗和提高性能。还要考虑线程安全,尤其在多线程环境下,确保正确同步以防止数据不一致。通过优化对象的创建与使用,提升代码效率和可靠性。
48 0
|
设计模式 Java
每日一道面试题之在java中,有哪些方式可以实现对象的实例化?
每日一道面试题之在java中,有哪些方式可以实现对象的实例化?
|
7月前
|
Java
Java基础之对象的引用
Java基础之对象的引用
22 0
|
Java
Java 反射--获取类的内部结构详解
Java 反射--获取类的内部结构详解
43 0
|
Java
Java初始化对象的工具 - 构造器
Java初始化对象的工具 - 构造器
142 0
|
存储 Java
java构造方法,对象的创建过程,数据类型的引用
java构造方法,对象的创建过程,数据类型的引用
147 0
|
Java 对象存储
Java中创建对象的五种方式
Java中创建对象的五种方式
Java中创建对象的五种方式
|
存储 缓存 Java
Java的四种引用方式
1.强引用(StrongReference) 2.软引用(SoftReference) 3.弱引用(WeakReference) 4.虚引用(PhantomReference) 引用队列(ReferenceQueue)
126 0
Java的四种引用方式