java类型不同名字相同_java反射 POJO在属性名字相同但类型不同情况下的复制

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值