现在的位置: 首页 > 综合 > 正文

使用反射复制一个JavaBean的对象

2013年10月07日 ⁄ 综合 ⁄ 共 2379字 ⁄ 字号 评论关闭

先看代码吧:

package com.java.study;

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

public class ReflectTester {
	public Object copy(Object object) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		Class classType = object.getClass();//获得对象的类型
		System.out.println("Class:" + classType.getName());
		
		//通过默认的构造函数创建一个新的对象
		Object objectCopy = classType.getConstructor(new Class[] {}).
		newInstance(new Object[] {});
		
		//获得对象的所有属性
		Field fields[] = classType.getDeclaredFields();
		
	    for(int i = 0; i < fields.length; i++) {
	    	Field field = fields[i];
	    	
	    	String fieldName = field.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()方法
	    	Method getMethod = classType.getMethod(getMethodName, new Class[]{});
	    	//获得和属性对应的setXXX()方法
	    	Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});
	    	
	    	//调用原对象的getXXX()方法
	    	Object value = getMethod.invoke(object, new Object[]{});
	    	System.out.println(fieldName + ":" + value);
	    	//调用复制对象的setXXX()方法
	    	setMethod.invoke(objectCopy, new Object[]{value});
	    }
	    return objectCopy;
		
	}
	
	public static void main(String[] args) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		Customer1 customer = new Customer1("tom",21);
		customer.setId(new Long(1));
		
		Customer1 customerCopy = (Customer1) new ReflectTester().copy(customer);
		System.out.println("Copy information:" + customerCopy.getName()+ ""
				+customerCopy.getAge());
	}

}

class Customer1 implements Serializable {
	
	private Long id;
	private String name;
	private int age;
	
	public Customer1() {}
	public Customer1(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	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;
	}
}



代码中有一个Customer1的JavaBean,通过反射复制了一个Customer1类的对象,为customerCopy,程序中的new Class[] { }是一种快捷方式,获得方法的引用。[]中用来放参数,{}里面可以放置方法的返回类型。new Class[] { }相当于new class("构造函数参数").newinstance.

//调用原对象的getXXX()方法
      Object value = getMethod.invoke(object, new Object[]{});
      System.out.println(fieldName + ":" + value);

用来获得特定对象的特定方法。

 

抱歉!评论已关闭.