码迷,mamicode.com
首页 > 编程语言 > 详细

java利用反射完成不同类之间相同属性的复制

时间:2014-09-22 18:15:23      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:反射   不同类   相同属性   复制属性值   java   

如果我们有两个不同的类对象,但他们具有相同的属性,我们怎么将一个对象的属性值复制给另外一个对象呢?
我们可以利用反射完成这个需求:首先我们利用反射得到两个对象的所有属性,再通过循环得到源对象(被复制的对象)每个属性值,然后再将值复制给目标对象(复制的对象)的属性。


源对象的类:

public class UserSource {

	private String name;
	
	private int age;
	
	private String address;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}
目标对象的类:

public class UserTarget {

	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return 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 CopyProperties {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		UserSource source = new UserSource();
		UserTarget target = new UserTarget();
		
		source.setAge(23);
		source.setName("hao");
		source.setAddress("gd");
		
		copy(source, target);
		
		System.out.println("Name:" + target.getName());
		System.out.println("Age:" + target.getAge());
	}
	
	/**
	 * 复制源对象和目标对象的属性值
	 *
	 */
	public static void copy(Object source, Object target) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		
		Class sourceClass = source.getClass();//得到对象的Class
		Class targetClass = target.getClass();//得到对象的Class
		
		Field[] sourceFields = sourceClass.getDeclaredFields();//得到Class对象的所有属性
		Field[] targetFields = targetClass.getDeclaredFields();//得到Class对象的所有属性
		
		for(Field sourceField : sourceFields){
			String name = sourceField.getName();//属性名
			Class type = sourceField.getType();//属性类型
			
			String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);
			
			Method getMethod = sourceClass.getMethod("get" + methodName);//得到属性对应get方法
			
			Object value = getMethod.invoke(source);//执行源对象的get方法得到属性值
			
			for(Field targetField : targetFields){
				String targetName = targetField.getName();//目标对象的属性名
				
				if(targetName.equals(name)){
					Method setMethod = targetClass.getMethod("set" + methodName, type);//属性对应的set方法
					
					setMethod.invoke(target, value);//执行目标对象的set方法
				}
			}
		}
	}
}
执行结果:

Name:hao
Age:23


这样,就完成了我们所需要的功能,成功复制了不同类对象的相同属性值。

java利用反射完成不同类之间相同属性的复制

标签:反射   不同类   相同属性   复制属性值   java   

原文地址:http://blog.csdn.net/angelwings_hao/article/details/39478395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!