java實(shí)現(xiàn)兩個(gè)對(duì)象之間傳值及簡(jiǎn)單的封裝
java兩個(gè)對(duì)象之間傳值及封裝
在項(xiàng)目里面使用SSH框架的過程中, 經(jīng)常涉及到修改,我們只要對(duì)部門的部門屬性進(jìn)行修改我們通常的做法是先從數(shù)據(jù)庫把對(duì)象查詢出來target
再把從頁面上傳遞來的修改過的值封裝成為一個(gè)對(duì)象model,我們需要把model中修改過的屬性重新賦值給target,再對(duì)target進(jìn)行保存.完成修改
在這個(gè)target.setXxx(model.getXxx)過程中有可能有大量的苦力工作要做,所以我利用反射做了一個(gè)簡(jiǎn)單的封裝,只需要傳遞兩個(gè)對(duì)象,就可以完成重新賦值的過程
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Description:
* 通過兩個(gè)對(duì)象的傳入,進(jìn)行兩個(gè)對(duì)象的賦值,
* 共2個(gè)參數(shù),把第一個(gè)對(duì)象中的參數(shù)傳遞給第二個(gè)對(duì)象
* @author: 長(zhǎng)河
* @version: 0.0.2beta
* @Company:
* @date: 2017年3月26日
*/
public class Demo {
//model是從前臺(tái)接受的數(shù)據(jù),封裝的對(duì)象
//target是從后臺(tái)根據(jù)id查詢到的數(shù)據(jù),封裝的對(duì)象
public static<T> void setValue(T model,T target) throws Exception {
//獲得實(shí)體類
Class clazz = model.getClass();
//查看有那些字段
Field[] fields = clazz.getDeclaredFields();
//遍歷
for (Field field : fields) {
//屬性的名字
String fieldName = field.getName();
//屬性的類型
//Class<?> type = field.getType();
//再得到getter方法的名字
String getMethodName = "get" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
Method getMethod = clazz.getMethod(getMethodName);
//判斷model的哪個(gè)屬性是否為空,利用get方法
Object object = getMethod.invoke(model);
if(object!=null) {
//不為空就進(jìn)行賦值
// 通過屬性名,來獲取對(duì)應(yīng)的setXXX的名字
String setMethodName = "set" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
//這是set方法
Method setMethod = clazz.getMethod(setMethodName, field.getType());
//這里需要進(jìn)行類型的強(qiáng)制轉(zhuǎn)換嗎?
setMethod.invoke(target, object);
}
}
}
}
其實(shí)我覺得應(yīng)該是field.getType,得到參數(shù)的類型,根據(jù)類型控制對(duì)象中值的賦予,而不是簡(jiǎn)單的使用Object進(jìn)行賦值.不過經(jīng)過簡(jiǎn)單的測(cè)試,這個(gè)類可以使用,沒什么大問題.
這是個(gè)簡(jiǎn)單的封裝還有其他的需要的條件可以考慮,可以把這個(gè)類封裝的更好
2019年8月9日15:23:37
更新,增加了object轉(zhuǎn)成Map的方法和Map轉(zhuǎn)object 的方法,還有一個(gè)簡(jiǎn)單的方法
/**
* 對(duì)象轉(zhuǎn)換成Map,以屬性名為key, 值為value.全部的轉(zhuǎn)成Map,null也弄進(jìn)去了
*
* @param object
* @return
*/
public static Map<String, Object> obj2Map(Object object) {
Map<String, Object> map = new HashMap<>();
if (object == null) {
return map;
}
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
Object o = null;
try {
o = field.get(object);
map.put(name, o);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return map;
}
/**
* 讀取properties 配置文件中的所有內(nèi)容,全部讀取,變成map,以key-value保存
*
* @param object
* @throws IllegalAccessException
*/
public static Map<String, String> handleBean2Map(Object object) throws IllegalAccessException {
Map<String, String> map = new HashMap<>();
Class clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
String value = String.valueOf(field.get(object));
map.put(name, value);
}
return map;
}
前端姐姐說
{key:value, key:value, key:value, key:value} 這種形式相對(duì)于[ {key:A, value:B},{key:A, value:B}, ]這種不好解析,不是很方便。
所以就有了下面的方法,轉(zhuǎn)換成數(shù)組:
/**
* 把Map變成List中的Map,組成key-value 的形式
*
* @param map
* @return
*/
public static <T> List<Map<String, Object>> map2List(Map<String, T> map) {
List<Map<String, Object>> newList = new ArrayList<Map<String, Object>>();
if (map == null || map.size() < 1) {
return newList;
}
for (Entry<String, T> entry : map.entrySet()) {
Map<String, Object> hashMap = new HashMap<String, Object>(2);
hashMap.put("key", entry.getKey());
hashMap.put("value", entry.getValue());
newList.add(hashMap);
}
return newList;
}
java 參數(shù)傳遞、對(duì)象、封裝
參數(shù)傳遞分為值傳遞(傳值)和引用傳遞(傳地址)。
面向?qū)ο蟮娜筇卣?/h3>
1. 封裝
2. 繼承
3. 多態(tài)
封裝表現(xiàn)
1、方法就是一個(gè)最基本封裝體。
2、類其實(shí)也是一個(gè)封裝體。
封裝的好處
1、提高了代碼的復(fù)用性。
2、隱藏了實(shí)現(xiàn)細(xì)節(jié),還要對(duì)外提供可以訪問的方式。便于調(diào)用者的使用。這是核心之一,也可以理解為就是封裝的概念。
3、提高了安全性。
構(gòu)建set、get方法
在類中右鍵,選擇source,選擇setter與getter方法

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
二種jar包制作方法講解(dos打包jar eclipse打包jar文件)
這篇文章主要介紹了二種jar包制作方法講解:dos打包jar和eclipse打包jar文件,大家參考使用吧2013-11-11
Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式
這篇文章主要為大家詳細(xì)介紹了Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)
下面小編就為大家?guī)硪黄猨ava中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作
這篇文章主要介紹了自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

