Java反射之复制简单的JavaBean对象

7 篇文章 0 订阅
5 篇文章 0 订阅
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 通过反射机制来复制JavaBean对象
 * @author WalkingDog
 *
 */

public class Reflect {
		
	public static void main(String[] args) throws Exception {
		Person person = new Person("walkingdog", 20);
		person.setId(2009324116L);
		Person personCopy = (Person)new Reflect().copy(person);
		System.out.println(personCopy.getId() + " " + personCopy.getName() + "  " + personCopy.getAge());
	}
	
	public Object copy(Object object) throws Exception{
		
		//要想使用反射,首先需要获得待处理类或对象所对应的Class对象
		//下面是获取Class对象的常用的3种方式
		//获得运行时的类
		Class<?> classType = object.getClass();
		//Class<?> classType = Costomer.class;
		//Class<?> classType = Class.forName("Costomer");
		 
		Constructor<?> constructor = classType.getConstructor(new Class<?>[]{});
		
		Object objectCopy = constructor.newInstance(new Object[]{});
		
		//以上两行代码等价于下面一行代码,newInstance()只能通过无参构造方法建立对象。
		//Object objectCopy = classType.newInstance();
		
		Field fields[] = classType.getDeclaredFields();
		for(Field field : fields){
			String name = field.getName();
			String firstLetter = name.substring(0, 1).toUpperCase();
			
			//获得属性的set、get的方法名
			String getMethodName = "get" + firstLetter + name.substring(1);
			String setMethodName = "set" + firstLetter + name.substring(1);
			
			Method getMethod = classType.getMethod(getMethodName, new Class<?>[]{});
			Method setMethod = classType.getMethod(setMethodName, new Class<?>[]{field.getType()});
			
			//获得copy对象的属性值
			Object value = getMethod.invoke(object, new Object[]{});
			
			//设置被copy对象的属性值
			setMethod.invoke(objectCopy, value);
		}
		return objectCopy;
	}
}

//JavaBean
class Person{
	private Long id;
	private String name;
	private int age;
	
	//每个JavaBean都应该实现无参构造方法
	public Person() {}
	
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}

	//setter、getter方法	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值