使用java 反射 copy 对象

package j2se.classloader;

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

/**
 * <p>Project : J2SE的基础知识</p>
 * <p>Tile : 利用反射 , 来实现对象的 拷贝 </p>
 * <p>Description : 
 *      通过java的反射 , 来实现对象的 cope 
 *      具体是得到  Method 类的实体 , Method实体可以调用 任何 Object  对象中 getXXX 和 setXXX方法 
 * </p>
 * <p>Date : 2013-03-23</p>
 * @author 
 * @version 1.0
 *
 */
public class TestCopyObjectByReflect {

	/**
	 * 
	 * @param args 类型为 : String[]
	 * @return  void 
	 */
	public static void main(String[] args){
		User u = new User() ;
		 u.setId("123456") ;
		 u.setUserName("刘德华") ;
		 u.setUserAge(30) ;
		 
		 User UserCopy = (User) new TestCopyObjectByReflect().copyObj(u);
	     System.out.println("Copy information: id = " + UserCopy.getId() 
	    		             + " , userName = " + UserCopy.getUserName() 
	    		             + " , userAge = "  + UserCopy.getUserAge());
		
	     new Son() ;
	}
	
	/**
	 * @description 实现对象的 Copy 
	 * @param obj 类型为 Object 
	 * @return  Object 
	 */
	public Object copyObj(Object obj){
		  Object objOfCopy = null   ;
			try {
				Class<?> clazz = obj.getClass() ;
				// Object objOfCopy = clazz.newInstance() ;
				 objOfCopy = clazz.getConstructor(new Class[]{ }).newInstance(new Object[]{ }) ;
				
				Field[] fs = clazz.getDeclaredFields() ;
				for(Field f : fs ){
					String fieldName = f.getName() ;
					String firstLetter = fieldName.substring(0, 1).toUpperCase() ;
					// 获得和属性对应的getXXX()方法的名字
		            String getMethodName = "get" + firstLetter + fieldName.substring(1);
		            // 获得和属性对应的setXXX()方法的名字
		            String setMethodName = "set" + firstLetter + fieldName.substring(1);
		            
		            // 获得和属性对应的getXXX()方法   , getMethod 可以调用 任意一个实体的 getXXX() 方法    
		            Method getMethod = clazz.getMethod(getMethodName, new Class[] {});
		            // 获得和属性对应的setXXX()方法 ,  setMethod 可以调用任意一个实体的setXXX() 方法
		            Method setMethod = clazz.getMethod(setMethodName, new Class[] { f.getType() });
		            
		            // 调用原对象的getXXX()方法
		            Object value =  getMethod.invoke(obj , new Object[]{}) ;
		            System.out.println(fieldName + ":" + value);
		            
		            // 调用拷贝对象的setXXX()方法
		            //setMethod.invoke(objOfCopy, value) ;
		            setMethod.invoke(objOfCopy, new Object[]{value}) ;
		           		
				}			
								
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			return  objOfCopy ;
		
	}
}


/**
 * @description 定义一个实体 user , 用来存放用户的信息 
 * @author 
 *
 */
class User {
	
	private  String id ;
	private  String userName ;
	private  Integer userAge ;
	
	public User(){
		
	}
    // gets and sets methods 
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public Integer getUserAge() {
		return userAge;
	}

	public void setUserAge(Integer userAge) {
		this.userAge = userAge;
	} ;
	
}

class Father {
	static {
		System.out.println("------------In Father static---------------------------");
	}
	
	Father() {
		System.out.println("------------In Father Constraction---------------------------");	
	}
	
}

class Son extends Father{
	static {
		System.out.println("------------In Son static---------------------------");
	}
	Son() {
		System.out.println("------------In Son Constraction---------------------------");	
		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值