package test;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ReflectTester
{
private static HashSet primitive=new HashSet();
static{
primitive.add("String");
primitive.add("long");
primitive.add("int");
}
public static void copy(Object a,Object b) throws Exception
{
Class> aType = a.getClass();
Class> bType = b.getClass();
Method[] aMethods = aType.getDeclaredMethods();
Method[] bMethods = bType.getDeclaredMethods();
Map fieldMethodMap = new HashMap();
for (Method method : bMethods) {
if (method.getName().startsWith("set")&& method.getGenericParameterTypes().length==1) {
fieldMethodMap.put(method.getName().substring(3), method);
}
}
Field[] aFields=aType.getDeclaredFields();
/*loop each field,check its type.
* case01:if it is primitive type,then get value by invoke get..() method in a,set value by invoke set..() method in b.
* case02:if it is self defined type,then need to create a new self defined type in object b(notice the type difference between a and b),then invoke copy
* case03:if it is array type,then for each array value,follow case02
* */
for(Field field:aFields){
if(primitive.contains(field.getType().getSimpleName())){
for (Method method : aMethods) {
String name = method.getName();
if (name.startsWith("get") && name.substring(3).equalsIgnoreCase(field.getName())) {
String fieldName = name.substring(3);
fieldMethodMap.get(fieldName).invoke(b,new Object[] { method.invoke(a, new Object[] {}) });
break;
}
}
}else{
Object OA=null;
if(field.getType().isArray()){
Object[] OAA=null;
for (Method method : aMethods) {
String name = method.getName();
if (name.startsWith("get") && name.substring(3).equalsIgnoreCase(field.getName())) {
String fieldName = name.substring(3);
OAA= (Object[]) method.invoke(a, new Object[] {}) ;
if(OAA!=null){
Object[] OB=(Object[]) Array.newInstance(bType.getDeclaredField(field.getName()).getType().getComponentType(),OAA.length);
for(int i=0;i
Object OB1=bType.getDeclaredField(field.getName()).getType().getComponentType().newInstance();
copy(OAA[i],OB1);
OB[i]=OB1;
}
fieldMethodMap.get(fieldName).invoke(b,new Object[] { OB });}
break;
}
}
}else{
for (Method method : aMethods) {
String name = method.getName();
if (name.startsWith("get") && name.substring(3).equalsIgnoreCase(field.getName())) {
String fieldName = name.substring(3);
OA= method.invoke(a);
if(OA!=null){
Object OB=bType.getDeclaredField(field.getName()).getType().newInstance();
copy(OA,OB);
fieldMethodMap.get(fieldName).invoke(b,new Object[] { OB });}
break;
}
}
}
}
}
}
public static void main(String[] args) throws Exception
{
BigInteger big;
// BeanUtils.
Customer customer = new Customer("Tom",20);
customer.setId(0);
Address a1=new Address();
a1.setId(1);
a1.setNum(110);
Address a2=new Address();
a2.setId(2);
a2.setNum(220);
Address[] aa={a1,a2};
int b= aa.length;
// customer.setAddresses(a1);
customer.setAddress(a1);
ReflectTester tester = new ReflectTester();
Customer1 c1=new Customer1();
tester.copy(customer,c1);
System.out.println(c1.getId());
System.out.println(c1.getName());
System.out.println(c1.getAge());
System.out.println(c1.getAddress().getNum());
// Address1[] bb=c1.getAddresses();
/*for(Address1 b1:bb){
System.out.println(b1.getId());
System.out.println(b1.getNum());
} */
}
}
class Address{
private int id;
private int num;
public Address(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
class Address1{
private int id;
private int num;
public Address1(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
class Customer
{
private long id;
private String name;
private int age;
// private Address[] addresses;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
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 Customer1
{
private long id;
private String name;
private int age;
// private Address1[] addresses;
private Address1 address;
public Address1 getAddress() {
return address;
}
public void setAddress(Address1 address) {
this.address = address;
}
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;
}
}