java 不同对象复制_java 反射实现不同对象相同属性值复制

package com.bin.design.util;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

import java.util.Arrays;

import java.util.List;

import com.bin.design.domain.People;

import com.bin.design.domain.User;public classTools {/**

* 对象相同属性copy

*

* @param obj

* @param toResult

* @return

* @throws Exception

* 转换报错*/

public static T cloneObj(Object obj, ClasstoResult) {if (obj == null) {return null;

}try{

T t=toResult.newInstance();

Field[] fields=toResult.getDeclaredFields();for(Field field : fields) {

field.setAccessible(true);//修改访问权限

if(Modifier.isFinal(field.getModifiers()))continue;if(isWrapType(field)) {

String firstLetter= field.getName().substring(0, 1).toUpperCase(); //首字母大写

String getMethodName = "get" + firstLetter + field.getName().substring(1);

String setMethodName= "set" + firstLetter + field.getName().substring(1);

Method getMethod= obj.getClass().getMethod(getMethodName); //从源对象获取get方法

Method setMethod = toResult.getMethod(setMethodName, new Class[] { field.getType() }); //从目标对象获取set方法//如果get 和 set方法都从一个对象中获取会出现object is not an instance of declaring class这个错误//like: User{name} People{name}//因为如果从源对象中获取,在setMethod.invoke调用的时候,虽然名字相同,会由于类的不同,导致//调用的方法却不是目标对象中应有的方法。实际就是:getMethod = com.package.User.getName();setMethod = com.package.User.setName();//而setMethod.invoke调用的结果就变成 People.setName() == People.(com.package.User.setName())//这里的setName却不是People该有的,so 报错了//同理,如果从目标对象中获取,在getMethod.invoke调用的时候也会出错。//因此,对于getMethod和setMethod的获取应该根据源对象和目标对象区别对待。//当然如果只是进行单独的对象复制,就不用担心会出现调用不属于本身的方法,也就不用区分对象get和set

Object value= getMethod.invoke(obj); //get 获取的是源对象的值

setMethod.invoke(t, new Object[] { value }); //set 设置的是目标对象的值

}

}returnt;

}catch(Exception e) {

System.out.println(e.getMessage());

e.printStackTrace();

}return null;

}/**

* 是否是基本类型、包装类型、String类型*/

private staticboolean isWrapType(Field field) {

String[] types= { "java.lang.Integer", "java.lang.Double", "java.lang.Float", "java.lang.Long","java.lang.Short", "java.lang.Byte", "java.lang.Boolean", "java.lang.Char", "java.lang.String", "int","double", "long", "short", "byte", "boolean", "char", "float"};

List typeList =Arrays.asList(types);return typeList.contains(field.getType().getName()) ? true : false;

}public static voidmain(String[] args) {

User user= newUser();

user.setName("AAA");

user.setPassword("vvv");

System.out.println("1"+user.getName()+user.getPassword());

People people=newPeople();

System.out.println("2"+people.getName());

User users= cloneObj(user,User.class);

System.out.println("3"+users.getName());

People p= cloneObj(user,People.class);

System.out.println("4"+p.getName());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值