java 对象拷贝属性_使用Java对两个对象的属性进行拷贝
最近和Java的反射打交道比較多一點,可能是因為自己以后的方向是架構(gòu)師的緣故吧,他們主要搞業(yè)務。我能也就搞架構(gòu),整天畫一些流程圖。
雖然對于只有一年實習經(jīng)驗的我,不知道這樣是否好,但是我還是那句話,不論好壞,先走著,畢竟也能學到很多東西,而且還可以鍛煉自己的思維能力。
表達能力,因為自己的產(chǎn)品做的再好,你就是表達不出來,說不出來優(yōu)勢,那么你就敗了。
先創(chuàng)建一個實體類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)測試代碼了。
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è)務需求:
* 對于某些業(yè)務進行某個或某些類的數(shù)據(jù)更新時,只想更新該類的部分字段,其它字段還使用之前的值。
*
* 遇到問題:
* 當有些業(yè)務需要增加或減少某個類的字段個數(shù)、修改字段名稱時,前臺可能只需要修改一個地方就可以解決了。
* 但是后臺由于采用的事件的方式進行處理,所以會有多個地方使用,修改起來比較困難。
*
* 主要解決問題:
* 即使字段個數(shù)或者字段名稱修改后后臺代碼也不需要修改。
*
* 解決方案:
* 在借鑒之前的解決方案的基礎上進行了修改。
* 通過遍歷該類的所有屬性,然后獲取新類的屬性值,如果新類的屬性值不為null、空字符串、基本類型的默認值
* 則把新的對象的屬性值賦值給老的對象屬性
*
* 優(yōu)點:1、即使增加或者修改字段個數(shù)后臺也不需要改動
* 2、即使修改字段名稱或者類型后臺也不需要改動
*
* 缺點:1、會遍歷一個類的所有屬性,并且判斷新對象的屬性值:是否存在以及是否為默認值。批量數(shù)據(jù)時性能會有些差
* 2、由于基本數(shù)據(jù)類型會有默認值,所以框架不知道這個字段的值到底要不要修改到新的對象上面。
*
*
* @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("數(shù)據(jù)庫中的老對象");
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);
//根據(jù)屬性獲取對象上的值
Object newObject = newField.get(newUser);
//過濾空的屬性或者一些默認值
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或者默認值
* 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());
}
}
功能簡單,但是學習到了一些新知識還是很開森的。
總結(jié)
以上是生活随笔為你收集整理的java 对象拷贝属性_使用Java对两个对象的属性进行拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么用柱形图_java绘制柱形图
- 下一篇: java 获取 邮箱联系人_在andro