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

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


woshixuye111

相关文章
|
14天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
15天前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
37 9
Java——反射&枚举
|
11天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
13 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
12天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
25 10
|
13天前
|
Java
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
本文介绍了拼多多面试中的模拟拼团问题,通过使用 `CyclicBarrier` 实现了多人拼团成功后提交订单并支付的功能。与之前的 `CountDownLatch` 方法不同,`CyclicBarrier` 能够确保所有线程到达屏障点后继续执行,并且屏障可重复使用。文章详细解析了 `CyclicBarrier` 的核心原理及使用方法,并通过代码示例展示了其工作流程。最后,文章还提供了 `CyclicBarrier` 的源码分析,帮助读者深入理解其实现机制。
|
6天前
|
安全 Java 编译器
Java反射的原理
Java 反射是一种强大的特性,允许程序在运行时动态加载、查询和操作类及其成员。通过 `java.lang.reflect` 包中的类,可以获取类的信息并调用其方法。反射基于类加载器和 `Class` 对象,可通过类名、`getClass()` 或 `loadClass()` 获取 `Class` 对象。反射可用来获取构造函数、方法和字段,并动态创建实例、调用方法和访问字段。虽然提供灵活性,但反射会增加性能开销,应谨慎使用。常见应用场景包括框架开发、动态代理、注解处理和测试框架。
|
9天前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
|
13天前
|
Java
Java的aop是如何实现的?原理是什么?
Java的aop是如何实现的?原理是什么?
15 4
|
14天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
15天前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
下一篇
无影云桌面