java 对象拷贝属性_使用Java对两个对象的属性进行拷贝
最近和Java的反射打交道比較多一點(diǎn),可能是因?yàn)樽约阂院蟮姆较蚴羌軜?gòu)師的緣故吧,他們主要搞業(yè)務(wù)。我能也就搞架構(gòu),整天畫一些流程圖。
雖然對(duì)于只有一年實(shí)習(xí)經(jīng)驗(yàn)的我,不知道這樣是否好,但是我還是那句話,不論好壞,先走著,畢竟也能學(xué)到很多東西,而且還可以鍛煉自己的思維能力。
表達(dá)能力,因?yàn)樽约旱漠a(chǎn)品做的再好,你就是表達(dá)不出來(lái),說(shuō)不出來(lái)優(yōu)勢(shì),那么你就敗了。
先創(chuàng)建一個(gè)實(shí)體類User
package com.mine.practice.copyproperty.entity;
/**
*
* @author 2014-11-6 上午10:28:10
* @version V1.0
*/
public class User {
private int id;
private String name;
private String pwd;
private double idG;
public double getIdG() {
return idG;
}
public void setIdG(double idG) {
this.idG = idG;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后就是具體的拷貝已經(jīng)測(cè)試代碼了。
package com.mine.practice.copyproperty.test;
import java.lang.reflect.Field;
import com.mine.practice.copyproperty.entity.User;
/**
* 屬性拷貝
* @author 2014-11-6 上午10:29:32
*/
public class TestCopyProperty {
/**
* 業(yè)務(wù)需求:
* 對(duì)于某些業(yè)務(wù)進(jìn)行某個(gè)或某些類的數(shù)據(jù)更新時(shí),只想更新該類的部分字段,其它字段還使用之前的值。
*
* 遇到問(wèn)題:
* 當(dāng)有些業(yè)務(wù)需要增加或減少某個(gè)類的字段個(gè)數(shù)、修改字段名稱時(shí),前臺(tái)可能只需要修改一個(gè)地方就可以解決了。
* 但是后臺(tái)由于采用的事件的方式進(jìn)行處理,所以會(huì)有多個(gè)地方使用,修改起來(lái)比較困難。
*
* 主要解決問(wèn)題:
* 即使字段個(gè)數(shù)或者字段名稱修改后后臺(tái)代碼也不需要修改。
*
* 解決方案:
* 在借鑒之前的解決方案的基礎(chǔ)上進(jìn)行了修改。
* 通過(guò)遍歷該類的所有屬性,然后獲取新類的屬性值,如果新類的屬性值不為null、空字符串、基本類型的默認(rèn)值
* 則把新的對(duì)象的屬性值賦值給老的對(duì)象屬性
*
* 優(yōu)點(diǎn):1、即使增加或者修改字段個(gè)數(shù)后臺(tái)也不需要改動(dòng)
* 2、即使修改字段名稱或者類型后臺(tái)也不需要改動(dòng)
*
* 缺點(diǎn):1、會(huì)遍歷一個(gè)類的所有屬性,并且判斷新對(duì)象的屬性值:是否存在以及是否為默認(rèn)值。批量數(shù)據(jù)時(shí)性能會(huì)有些差
* 2、由于基本數(shù)據(jù)類型會(huì)有默認(rèn)值,所以框架不知道這個(gè)字段的值到底要不要修改到新的對(duì)象上面。
*
*
* @author 2014-11-6 上午11:01:03
* @param args
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-6
* @modify by reason:{原因}
*/
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
//老對(duì)象
User oldUser = new User();
oldUser.setId(1);
oldUser.setName("name1");
oldUser.setPwd("pwd1");
oldUser.setIdG(1.2);
System.out.println("數(shù)據(jù)庫(kù)中的老對(duì)象");
print(oldUser);
//新對(duì)象
User newUser = new User();
newUser.setName("name2");
System.out.println("前臺(tái)傳遞過(guò)來(lái)的新對(duì)象");
print(newUser);
//功能需求
//把之前的老對(duì)象的id和name修改掉,但是pwd不需要修改
copyProperty(oldUser,newUser);
System.out.println("----------老對(duì)象被修改后-------------");
print(oldUser);
}
/**
*
* @author 2014-11-6 上午11:26:36
* @param oldUser
* @param newUser
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @modificationHistory=========================邏輯或功能性重大變更記錄
* @modify by user: {修改人} 2014-11-6
* @modify by reason:{原因}
*/
@SuppressWarnings("rawtypes")
private static void copyProperty(User oldUser,User newUser) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
//新的class
Class newClass = newUser.getClass();
//老的class
Class oldClass = oldUser.getClass();
//該類所有的屬性
Field[] newFields = newClass.getDeclaredFields();
//新的屬性
Field newField = null;
//老的屬性
Field oldField = null;
for(Field f : newFields){
//類中的屬性名稱
String fieldName = f.getName();
//通過(guò)屬性名稱獲取屬性
newField = newClass.getDeclaredField(fieldName);
//獲取屬性的值時(shí)需要設(shè)置為 true 則指示反射的對(duì)象在使用時(shí)應(yīng)該取消 Java 語(yǔ)言訪問(wèn)檢查。
//值為 false 則指示反射的對(duì)象應(yīng)該實(shí)施 Java 語(yǔ)言訪問(wèn)檢查。
newField.setAccessible(true);
//根據(jù)屬性獲取對(duì)象上的值
Object newObject = newField.get(newUser);
//過(guò)濾空的屬性或者一些默認(rèn)值
if (isContinue(newObject)) {
continue;
}
oldField = oldClass.getDeclaredField(fieldName);
oldField.setAccessible(true);
oldField.set(oldUser, newObject);
}
}
/**
* 是否跳出本次循環(huán)
* @author 2014-11-6 上午11:37:22
* @param object
* @return true 是 有null或者默認(rèn)值
* false 否 有默認(rèn)值
*/
private static boolean isContinue(Object object){
if (object == null || "".equals(object)) {
return true;
}
String valueStr = object.toString();
if ("0".equals(valueStr) || "0.0".equals(valueStr)) {
return true;
}
return false;
}
/**
*
* @author 2014-11-6 上午10:57:32
* @param user
*/
private static void print(User user){
System.out.println("id: "+user.getId());
System.out.println("name: "+user.getName());
System.out.println("pwd: "+user.getPwd());
System.out.println("idG: "+user.getIdG());
}
}
功能簡(jiǎn)單,但是學(xué)習(xí)到了一些新知識(shí)還是很開(kāi)森的。
總結(jié)
以上是生活随笔為你收集整理的java 对象拷贝属性_使用Java对两个对象的属性进行拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java怎么用柱形图_java绘制柱形图
- 下一篇: Java自动拆装箱面试_跟王老师学泛型(