import java.lang.reflect.*; public class ReflectTester { public Object copy(Object object) throws Exception{ //获得对象的类型 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 Exception{ Customer customer=new Customer("Tom",21); customer.setId(new Long(1)); Customer customerCopy=(Customer)new ReflectTester().copy(customer); System.out.println("Copy information:"+customerCopy.getName()+" "+customerCopy.getAge()); } } class Customer{ private Long id; private String name; private int age; public Customer(){} public Customer(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;} }
输出结果
Class:com.lwf.exception.Customer
id:1
name:Tom
age:21
Copy information:Tom 21
下面讲一下Class的getFields与getDeclaredFields的区别:
/**
*
*/
package com.lwf.exception;
import java.lang.reflect.Field;
import java.util.Date;
public class TestClassField {
/**
* @Title: main
* @Description: TODO
* @param @param args
* @return void
* @throws
*/
public static void main(String[] args) {
Pig p = new Pig();
Field [] fields = p.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
System.out.println(f.getName() + "," + f.getType().toString());
}
//fields = null;
System.out.println("----------------------------");
fields = p.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
System.out.println(f.getName() + "," + f.getType().toString());
}
}
}
class Animal{
private String name;
protected String color;
public String sex;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the color
*/
public String getColor() {
return color;
}
/**
* @param color the color to set
*/
public void setColor(String color) {
this.color = color;
}
/**
* @return the sex
*/
public String getSex() {
return sex;
}
/**
* @param sex the sex to set
*/
public void setSex(String sex) {
this.sex = sex;
}
}
class Pig extends Animal{
public int age;
Date birthDay;
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the birthDay
*/
public Date getBirthDay() {
return birthDay;
}
/**
* @param birthDay the birthDay to set
*/
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
}
输出结果:
age,int
birthDay,class java.util.Date
----------------------------
age,int
sex,class java.lang.String
getFields与getDeclaredFields的区别如下
getFields返回类及所有父类的公有属性;getDeclaredFields只返回类自身的所有属性。