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

使用反射实现类的拷贝

    博客分类:
  • java
阅读更多

 

public class Customer {

	private Long id;
	private String name;
	private int age;
	
	public Customer(){}

	/**
	 * @return 返回 id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param 对id进行赋值
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * @return 返回 name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param 对name进行赋值
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return 返回 age
	 */
	public int getAge() {
		return age;
	}

	/**
	 * @param 对age进行赋值
	 */
	public void setAge(int age) {
		this.age = age;
	}
}

 

 

 

 

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectTester {

	/**
	 * @Title: copy
	 * @Description: 根据指定的方法的参数去 构造一个新的对象的拷贝
	 * @param obj 要拷贝的对象
	 * @return
	 * @author 
	 */
	@SuppressWarnings("rawtypes")
	public Object copy(Object obj) {

		if (null == obj) {
			return null;
		}

		// 获得对象的类型
		Class classType = obj.getClass();

		System.out
				.println("the type of " + obj + " is " + classType.toString());

		Object objectCopy = null;

		try {
			/*
			 * 通过默认构造方法去创建一个新的对象, 
			 * getConstructor的视其参数决定调用哪个构造方法
			 */
			objectCopy = classType.getConstructor(new Class[] {}).newInstance(
					new Object[] {});

		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		try {
			// 获得对象的所有属性
			Field[] fields = classType.getDeclaredFields();

			for (Field field : fields) {
				// 属性名称
				String fieldName = field.getName();
				String stringLetter = fieldName.substring(0, 1).toUpperCase();

				// 获得相应属性的getXXX和setXXX方法名称
				String getName = "get".concat(stringLetter).concat(
						fieldName.substring(1));
				String setName = "set".concat(stringLetter).concat(
						fieldName.substring(1));

				// 获取相应的方法
				Method getMethod = classType.getMethod(getName, new Class[] {});
				Method setMethod = classType.getMethod(setName,
						new Class[] { field.getType() });

				// 调用源对象的getXXX()方法
				Object value = getMethod.invoke(obj, new Object[] {});

				// 调用拷贝对象的setXXX()方法
				setMethod.invoke(objectCopy, new Object[] { value });
			}
		} catch (NoSuchMethodException ex) {
			ex.printStackTrace();
		} catch (SecurityException ex) {
			ex.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		return objectCopy;
	}
}

 

测试类:

   

public class Test {

	/**
	 * @Title: main
	 * @Description: TODO
	 * @param args
	 * @author wenjianhai
	 */
	public static void main(String[] args) {

		Customer customer = new Customer();
		customer.setAge(20);
		customer.setId(1L);
		customer.setName("test");

		// 拷贝后的新对象
		Customer customer2 = (Customer) new ReflectTester().copy(customer);

		System.out.println("id\tname\tage");

		if (null != customer2) {
			System.out.println(customer2.getId() + "\t" + customer2.getName()
					+ "\t" + customer2.getAge());
		}

		System.out.println("customer=" + customer);
		System.out.println("customer2=" + customer2);
	}

}

 

 

测试结果:

   

the type of com.java.reflect.test1.Customer@d9f9c3 is class com.java.reflect.test1.Customer
id	name	age
1	test	20
customer=com.java.reflect.test1.Customer@d9f9c3
customer2=com.java.reflect.test1.Customer@1a46e30

 

  

分享到:
评论

相关推荐

    使用java反射机制实现java的深拷贝

    这个例子展示了如何使用反射实现一个通用的深拷贝方法。但需要注意的是,这种方法对类的结构有一定限制,比如不能处理循环引用,也不能处理无法序列化的对象。此外,为了提高性能,实际应用中可以考虑使用序列化或...

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

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

    利用反射技术实现POJO值拷贝

    本篇文章将探讨如何利用反射技术实现POJO(Plain Old Java Object)值的拷贝,这对于数据传输、对象复制等场景非常有用。 POJO是一个简单的Java对象,没有特定的框架限制,通常包含一组属性和对应的getter/setter...

    反射拷贝属性

    以上就是关于“反射拷贝属性”的基本原理和实现步骤。在实际开发中,也可以使用一些现成的库,如Apache Commons BeanUtils的`BeanUtils.copyProperties()`方法,它能简化属性复制的过程,但可能无法处理复杂的嵌套...

    C#浅拷贝(MemberwiseClone等多种方法)与深拷贝(反射、多种反序列化)实例

    本文将深入探讨这两种拷贝方式以及它们在C#中的实现方法,特别是如何使用`MemberwiseClone`、反射以及反序列化技术。 首先,浅拷贝是通过`Object.MemberwiseClone()`方法来实现的。这个方法为对象创建一个新的实例...

    使用反射+缓存+委托实现一个不同对象之间同名同类型属性值的快速拷贝的小程序

    分享一个使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝 的小程序, http://blog.csdn.net/bluedoctor/article/details/8424510 是原理说明,相信请看链接文章。

    C#基于表达式(Expression)实现对象深拷贝

    本主题将详细探讨如何使用C#的表达式(Expression)来实现对象的深拷贝。 首先,我们需要理解什么是表达式树(Expression Tree)。表达式树是一种表示代码的抽象数据结构,它能够让我们以数据的形式查看和操作代码...

    C# 使用反射来实现对象的深度复制方法

    以下是一个使用反射实现对象深度复制的示例代码: ```csharp public static class DeepCopyHelper { public static object Copy(this object obj) { Object targetDeepCopyObj; Type targetType = obj.GetType...

    java 深度拷贝 复制 深度复制.zip

    在实际应用中,我们还可以考虑使用序列化和反序列化的方式实现深度拷贝,或者使用第三方库如Apache Commons Lang的`DeepClone`方法,它们提供了更简便的解决方案。但这里我们重点讨论了如何仅通过Java反射机制来实现...

    C#深度拷贝克隆源码

    3. **使用反射**:通过反射遍历类的所有字段,逐个复制。这种方法适用于自定义的复杂类型,但效率较低且不易维护。 4. **使用`System.MemberInfo`和`Expression`**:对于更复杂的情况,可以使用`MemberInfo`和`...

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

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

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

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

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

    Java没有内置的深拷贝机制,但可以通过反射实现。假设我们有两个 `Person` 类的实例 `person1` 和 `person2`,我们想要将 `person1` 的属性值复制到 `person2`: ```java public static void copyBeanProperties...

    BeanUtil属性拷贝工具类

    BeanUtil属性拷贝工具类,支持基本的javabean属性拷贝,通过java反射和泛型编程实现了list属性拷贝

    类属性拷贝器(源码)

    3. **实现类属性拷贝器** 实现一个类属性拷贝器,通常需要以下步骤: - **反射机制**:利用C#的`System.Reflection`命名空间,获取类的类型信息,包括其属性列表。 - **匹配属性**:比较源对象和目标对象的属性,...

    利用反射,动态加载DLL,卸载DLL

    `Type`类代表.NET中的类型,我们可以使用`dllAssembly.GetTypes()`获取DLL中的所有类型,或者`dllAssembly.GetType("Namespace.ClassName")`获取特定类型。接下来,可以使用`Activator.CreateInstance`创建这些类型...

    Java反射机制总结(实例分析)

    - **动态代理**:Java的动态代理机制(`java.lang.reflect.Proxy`)利用反射实现代理类的创建。 - **元数据处理**:例如处理注解(annotations),获取带有特定注解的类、方法等。 - **通用工具类**:例如深度拷贝、...

    Java 细数浅拷贝和深拷贝

    - 使用Java反射API来复制对象。 - 使用Apache Commons Lang库中的`BeanUtils.copyProperties`方法。 - 使用第三方库如Guava提供的拷贝工具。 #### 总结 在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式...

    反射内存卡rf2g测试11.pdf

    工具使用:在Linux环境下,如Red Hat系统,使用QuikLab这类测试工具来进行实际的测试操作。 4. QuikLab测试软件的使用 QuikLab是一种测试工具,它能帮助创建测试项目,并为反射内存卡配置测试环境。 环境配置:创建...

Global site tag (gtag.js) - Google Analytics