Java 通過(guò)反射給實(shí)體類賦值操作
表單提交這個(gè)方法是挺方便的,但在java來(lái)說(shuō)就顯得有些麻煩了,
怎么個(gè)麻煩呢,就是當(dāng)你字段多的時(shí)候,你就得一個(gè)一個(gè)的獲取其對(duì)應(yīng)的值,這樣代碼量就多了起來(lái),其代碼量不說(shuō),維護(hù)也是一個(gè)問(wèn)題。
所以就有了這樣一個(gè)類,只需把request和實(shí)體類對(duì)象傳進(jìn)去就行了,
這樣就會(huì)得到一個(gè)有值的實(shí)體類對(duì)象
下面是代碼示例
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Date; import java.sql.Timestamp; import java.text.SimpleDateFormat; import javax.servlet.http.HttpServletRequest; public class RequestHelper { /** * 把request請(qǐng)求的數(shù)據(jù)放到j(luò)ava對(duì)象中 */ public static <T> T getSingleRequest(HttpServletRequest request, Class<T> obj) { //創(chuàng)建實(shí)例 T instance = null; try { //獲取類中聲明的所有字段 Field[] fields = obj.getDeclaredFields(); //創(chuàng)建新的實(shí)例對(duì)象 instance = obj.newInstance(); //利用循環(huán) for (int i = 0; i < fields.length; i++) { //獲取字段的名稱 String name = fields[i].getName(); //把序列化id篩選掉 if (name.equals("serialVersionUID")) { continue; } //獲取字段的類型 Class<?> type = obj.getDeclaredField(name).getType(); // 首字母大寫(xiě) String replace = name.substring(0, 1).toUpperCase() + name.substring(1); //獲得setter方法 Method setMethod = obj.getMethod("set" + replace, type); //獲取到form表單的所有值 String str = request.getParameter(replace); if (str == null || "".equals(str)) { // 首字母小寫(xiě) String small = name.substring(0, 1).toLowerCase() + name.substring(1); str = request.getParameter(small); } //通過(guò)setter方法賦值給對(duì)應(yīng)的成員變量 if (str != null && !"".equals(str)) { // ---判斷讀取數(shù)據(jù)的類型 if (type.isAssignableFrom(String.class)) { setMethod.invoke(instance, str); } else if (type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)) { setMethod.invoke(instance, Integer.parseInt(str)); } else if (type.isAssignableFrom(Double.class) || type.isAssignableFrom(double.class)) { setMethod.invoke(instance, Double.parseDouble(str)); } else if (type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class)) { setMethod.invoke(instance, Boolean.parseBoolean(str)); } else if (type.isAssignableFrom(Date.class)) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); setMethod.invoke(instance, dateFormat.parse(str)); } else if (type.isAssignableFrom(Timestamp.class)) { SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); setMethod.invoke(instance, new Timestamp(dateFormat.parse(str).getTime())); } } } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } //返回實(shí)體類對(duì)象 return instance; } }
補(bǔ)充知識(shí):java反射對(duì)實(shí)體類取值和賦值,可以寫(xiě)成通過(guò)實(shí)體類獲取其他元素的數(shù)據(jù),很方便哦~~~
項(xiàng)目中需要過(guò)濾前面表單頁(yè)面中傳過(guò)來(lái)的實(shí)體類的中的String類型變量的前后空格過(guò)濾,由于前幾天看過(guò)一個(gè)其他技術(shù)博客的的java反射講解,非常受益。于是,哈哈哈
public static <T> void modelTrim(T model){ Class<T> clazz = (Class<T>) model.getClass(); //獲取所有的bean中所有的成員變量 Field[] fields = clazz.getDeclaredFields(); for(int j=0;j<fields.length;j++){ //獲取所有的bean中變量類型為String的變量 if("String".equals(fields[j].getType().getSimpleName())){ try { //獲取get方法名 String methodName = "get"+fields[j].getName().substring(0, 1).toUpperCase() +fields[j].getName().replaceFirst("\\w", ""); Method getMethod = clazz.getDeclaredMethod(methodName); //打破封裝 getMethod.setAccessible(true); //得到該方法的值 Object methodValue = getMethod.invoke(model); //判斷值是否為空或者為null,非的話這過(guò)濾前后空格 if(methodValue != null && !"".equals(methodValue)){ //獲取set方法名 String setMethodName = "set"+fields[j].getName().substring(0, 1).toUpperCase() +fields[j].getName().replaceFirst("\\w", ""); //得到get方法的Method對(duì)象,帶參數(shù) Method setMethod = clazz.getDeclaredMethod(setMethodName,fields[j].getType()); setMethod.setAccessible(true); //賦值 setMethod.invoke(model, (Object)String.valueOf(methodValue).trim()); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } }
親自上面試用是好使的
下面還有一套,通過(guò)request,和實(shí)體類來(lái)封裝本人還未實(shí)驗(yàn),以后有機(jī)會(huì)再試試
/** * 保存數(shù)據(jù) *@param request *@param dto *@throws Exception */ public static void setDTOValue(HttpServletRequest request, Object dto) throws Exception { if ((dto == null) || (request == null)) return; //得到類中所有的方法 基本上都是set和get方法 Method[] methods = dto.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { try { //方法名 String methodName = methods[i].getName(); //方法參數(shù)的類型 Class[] type = methods[i].getParameterTypes(); //當(dāng)時(shí)set方法時(shí),判斷依據(jù):setXxxx類型 if ((methodName.length() > 3) && (methodName.startsWith("set")) && (type.length == 1)) { //將set后面的大寫(xiě)字母轉(zhuǎn)成小寫(xiě)并截取出來(lái) String name = methodName.substring(3, 4).toLowerCase() + methodName.substring(4); Object objValue = getBindValue(request, name, type[0]); if (objValue != null) { Object[] value = { objValue }; invokeMothod(dto, methodName, type, value); } } } catch (Exception ex) { throw ex; } } }
以上這篇Java 通過(guò)反射給實(shí)體類賦值操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java如何通過(guò)反射方式生成數(shù)據(jù)庫(kù)實(shí)體類
- Java反射機(jī)制,如何將一個(gè)實(shí)體類所有字段賦值為null
- java 實(shí)現(xiàn)反射 json動(dòng)態(tài)轉(zhuǎn)實(shí)體類--fastjson
- 利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作
- java反射機(jī)制給實(shí)體類相同字段自動(dòng)賦值實(shí)例
- java反射遍歷實(shí)體類屬性和類型,并賦值和獲取值的簡(jiǎn)單方法
- Java如何通過(guò)反射取實(shí)體類字段取值
相關(guān)文章
SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器詳細(xì)圖文流程
作為后臺(tái)開(kāi)發(fā),項(xiàng)目打包部署是經(jīng)常性的操作,下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Java語(yǔ)言ReadWriteLock特性實(shí)例測(cè)試
這篇文章主要介紹了Java語(yǔ)言ReadWriteLock特性實(shí)例測(cè)試,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Java編程synchronized與lock的區(qū)別【推薦】
互聯(lián)網(wǎng)信息泛濫環(huán)境下少有的良心之作!如果您想對(duì)Java編程synchronized與lock的區(qū)別有所了解,這篇文章絕對(duì)值得!分享給大家,供需要的朋友參考。不說(shuō)了,我先學(xué)習(xí)去了。2017-10-10Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼
本文主要介紹了Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Java實(shí)現(xiàn)CSV格式轉(zhuǎn)對(duì)象
csv全稱“Comma-Separated Values”,是一種逗號(hào)分隔值格式的文件,常用來(lái)存儲(chǔ)數(shù)據(jù)的純文本格式文件。本文將用Java語(yǔ)言實(shí)現(xiàn)CSV轉(zhuǎn)對(duì)象,需要的可以參考一下2022-06-06java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別
本文主要介紹了java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10一文詳解Java中的反射與new創(chuàng)建對(duì)象
Java中的反射(Reflection)和使用new關(guān)鍵字創(chuàng)建對(duì)象是兩種不同的對(duì)象創(chuàng)建方式,各有優(yōu)缺點(diǎn)和適用場(chǎng)景,本文小編給大家詳細(xì)介紹了Java中的反射與new創(chuàng)建對(duì)象,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-07-07Java連接數(shù)據(jù)庫(kù)步驟解析(Oracle、MySQL)
本文主要介紹了Java連接Oracle數(shù)據(jù)庫(kù)和MySQL數(shù)據(jù)庫(kù)的步驟解析。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12擴(kuò)展Hibernate使用自定義數(shù)據(jù)庫(kù)連接池的方法
這篇文章主要介紹了擴(kuò)展Hibernate使用自定義數(shù)據(jù)庫(kù)連接池的方法,涉及Hibernate數(shù)據(jù)庫(kù)操作擴(kuò)展的相關(guān)技巧,需要的朋友可以參考下2016-03-03