日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 对象拷贝属性_使用Java对两个对象的属性进行拷贝

發布時間:2024/10/8 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 对象拷贝属性_使用Java对两个对象的属性进行拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近和Java的反射打交道比較多一點,可能是因為自己以后的方向是架構師的緣故吧,他們主要搞業務。我能也就搞架構,整天畫一些流程圖。

雖然對于只有一年實習經驗的我,不知道這樣是否好,但是我還是那句話,不論好壞,先走著,畢竟也能學到很多東西,而且還可以鍛煉自己的思維能力。

表達能力,因為自己的產品做的再好,你就是表達不出來,說不出來優勢,那么你就敗了。

先創建一個實體類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;

}

}

然后就是具體的拷貝已經測試代碼了。

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 {

/**

* 業務需求:

* 對于某些業務進行某個或某些類的數據更新時,只想更新該類的部分字段,其它字段還使用之前的值。

*

* 遇到問題:

* 當有些業務需要增加或減少某個類的字段個數、修改字段名稱時,前臺可能只需要修改一個地方就可以解決了。

* 但是后臺由于采用的事件的方式進行處理,所以會有多個地方使用,修改起來比較困難。

*

* 主要解決問題:

* 即使字段個數或者字段名稱修改后后臺代碼也不需要修改。

*

* 解決方案:

* 在借鑒之前的解決方案的基礎上進行了修改。

* 通過遍歷該類的所有屬性,然后獲取新類的屬性值,如果新類的屬性值不為null、空字符串、基本類型的默認值

* 則把新的對象的屬性值賦值給老的對象屬性

*

* 優點:1、即使增加或者修改字段個數后臺也不需要改動

* 2、即使修改字段名稱或者類型后臺也不需要改動

*

* 缺點:1、會遍歷一個類的所有屬性,并且判斷新對象的屬性值:是否存在以及是否為默認值。批量數據時性能會有些差

* 2、由于基本數據類型會有默認值,所以框架不知道這個字段的值到底要不要修改到新的對象上面。

*

*

* @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 {

//老對象

User oldUser = new User();

oldUser.setId(1);

oldUser.setName("name1");

oldUser.setPwd("pwd1");

oldUser.setIdG(1.2);

System.out.println("數據庫中的老對象");

print(oldUser);

//新對象

User newUser = new User();

newUser.setName("name2");

System.out.println("前臺傳遞過來的新對象");

print(newUser);

//功能需求

//把之前的老對象的id和name修改掉,但是pwd不需要修改

copyProperty(oldUser,newUser);

System.out.println("----------老對象被修改后-------------");

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();

//通過屬性名稱獲取屬性

newField = newClass.getDeclaredField(fieldName);

//獲取屬性的值時需要設置為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。

//值為 false 則指示反射的對象應該實施 Java 語言訪問檢查。

newField.setAccessible(true);

//根據屬性獲取對象上的值

Object newObject = newField.get(newUser);

//過濾空的屬性或者一些默認值

if (isContinue(newObject)) {

continue;

}

oldField = oldClass.getDeclaredField(fieldName);

oldField.setAccessible(true);

oldField.set(oldUser, newObject);

}

}

/**

* 是否跳出本次循環

* @author 2014-11-6 上午11:37:22

* @param object

* @return true 是 有null或者默認值

* false 否 有默認值

*/

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());

}

}

功能簡單,但是學習到了一些新知識還是很開森的。

總結

以上是生活随笔為你收集整理的java 对象拷贝属性_使用Java对两个对象的属性进行拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。