`
xurichusheng
  • 浏览: 336210 次
  • 性别: 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的深拷贝

    NULL 博文链接:https://1064319393.iteye.com/blog/2114611

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

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

    BeanUtil属性拷贝工具类

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

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

    java反射机制创建对象实现:java 深度拷贝 -超完美,只使反射机制,不使用其它封装好的深度拷贝的工具类

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

    所以使用反射机制来实现。   但是如果是服务端运行的话,还是建议手动的实现。 毕竟反射机制比直接写出来的效率要慢一些。 代码: public static class DeepCopyHelper { public static object Copy(this object...

    Java 基础核心总结 +经典算法大全.rar

    Collections 类集合实现类特征图 泛形 泛型的使用 用泛型表示类 用泛型表示接口泛型方法 泛型通配符 反射 Class 类Field 类Method 类ClassLoader 类 枚举 枚举特性 枚举和普通类-样枚举神秘之处 枚举类 I/O File...

    计算机类基础问题

     C++语言考查的重点主要有:多继承,抽象类,虚函数,拷贝构造函数,析构函数, 动态联编,多态,const,static。以下是我面试中遇到的问题: 1)你听说过拷贝构造函数吗?能具体说一下它的作用吗?(汉略) 。。。...

    java-server-interview-questions:java服务端面试题整理

    反射的原理,反射创建类实例的三种方式是什么? cloneable接口实现原理,浅拷贝or深拷贝 Java NIO使用 hashtable和hashmap的区别及实现原理,hashmap会问到数组索引,hash碰撞怎么解决 arraylist和linke

    Java2核心技术.part5

    5.5.2使用反射分析类的能力 5.5.3在运行时使用反射分析对象 5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2...

    Java2核心技术.part3

    5.5.2使用反射分析类的能力 5.5.3在运行时使用反射分析对象 5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2...

    Java2核心技术.part1

    5.5.2使用反射分析类的能力 5.5.3在运行时使用反射分析对象 5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2接口与抽象...

    Java2核心技术.part6

    5.5.2使用反射分析类的能力 5.5.3在运行时使用反射分析对象 5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2...

    Java2核心技术.part4

    5.5.2使用反射分析类的能力 5.5.3在运行时使用反射分析对象 5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2...

    Java2核心技术.part2

    5.5.2使用反射分析类的能力 5.5.3在运行时使用反射分析对象 5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2...

    wpf源码大全 精通C#3.0图书源码 详细源码 学习好用

    UseCopyToTable 演示通过LINQ查询在DataTable之间拷贝数据。 UseORDesigner 演示对象关系设计器(OR Designer)的使用。 UseDataContextLINQ 演示通过DataContext进行数据绑定和访问。 UseDataView 演示...

    Web表现层框架 MyFrame

    基本控制流程类似Struts,但业务控制类(Action)不须要实现任务接口,表单收集类也不须实现任何接口(框架中大量用到反射机制),从而不用从ActionForm拷贝属性到实体Bean直接做为DTO向下层传递。 想自己写Web框架的...

    基于javatcpsocket通信的拆包和装包源码-someData:存放一些思维导图,图片,ppt等等

    接口和抽象类的区别,使用场景 类的实例化顺序,当new执行的时候,父类静态数据,父类构造函数,字段,子类静态数据,子类的构造函数怎么执行的 继承和聚合的区别 final的用途 深拷贝,浅拷贝的区别 自动装箱拆箱 ...

Global site tag (gtag.js) - Google Analytics