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

歡迎訪問 生活随笔!

生活随笔

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

java

java 反射获取实体类_Java 通过反射给实体类赋值操作

發布時間:2024/2/28 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 反射获取实体类_Java 通过反射给实体类赋值操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

表單提交這個方法是挺方便的,但在java來說就顯得有些麻煩了,

怎么個麻煩呢,就是當你字段多的時候,你就得一個一個的獲取其對應的值,這樣代碼量就多了起來,其代碼量不說,維護也是一個問題。

所以就有了這樣一個類,只需把request和實體類對象傳進去就行了,

這樣就會得到一個有值的實體類對象

下面是代碼示例

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請求的數據放到java對象中

*/

public static T getSingleRequest(HttpServletRequest request, Class obj) {

//創建實例

T instance = null;

try {

//獲取類中聲明的所有字段

Field[] fields = obj.getDeclaredFields();

//創建新的實例對象

instance = obj.newInstance();

//利用循環

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

// 首字母大寫

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)) {

// 首字母小寫

String small = name.substring(0, 1).toLowerCase()

+ name.substring(1);

str = request.getParameter(small);

}

//通過setter方法賦值給對應的成員變量

if (str != null && !"".equals(str)) {

// ---判斷讀取數據的類型

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

}

//返回實體類對象

return instance;

}

}

補充知識:java反射對實體類取值和賦值,可以寫成通過實體類獲取其他元素的數據,很方便哦~~~

項目中需要過濾前面表單頁面中傳過來的實體類的中的String類型變量的前后空格過濾,由于前幾天看過一個其他技術博客的的java反射講解,非常受益。于是,哈哈哈

public static void modelTrim(T model){

Class clazz = (Class) model.getClass();

//獲取所有的bean中所有的成員變量

Field[] fields = clazz.getDeclaredFields();

for(int j=0;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,非的話這過濾前后空格

if(methodValue != null && !"".equals(methodValue)){

//獲取set方法名

String setMethodName = "set"+fields[j].getName().substring(0, 1).toUpperCase()

+fields[j].getName().replaceFirst("\\w", "");

//得到get方法的Method對象,帶參數

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

}

}

}

}

親自上面試用是好使的

下面還有一套,通過request,和實體類來封裝本人還未實驗,以后有機會再試試

/**

* 保存數據

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

//方法參數的類型

Class[] type = methods[i].getParameterTypes();

//當時set方法時,判斷依據:setXxxx類型

if ((methodName.length() > 3) && (methodName.startsWith("set")) && (type.length == 1)) {

//將set后面的大寫字母轉成小寫并截取出來

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 通過反射給實體類賦值操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持聚米學院。

總結

以上是生活随笔為你收集整理的java 反射获取实体类_Java 通过反射给实体类赋值操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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