java利用反射機制完成JavaBean的屬性賦值

来源:https://www.cnblogs.com/deyujincheng/archive/2018/07/18/9332780.html
-Advertisement-
Play Games

今天碰到一個場景,就是一個JavaBean,有些屬性的值需要去資料庫其他表中獲取,這樣就需要調用其他dao方法得到這個值,然後再set進去。 可是問題來了,如果需要用這種方式賦值的屬性特別多的話,一個一個set進去就需要寫很多set方法,代碼不僅冗餘,而且很麻煩。 於是就想通過反射機制去自動set值 ...


今天碰到一個場景,就是一個JavaBean,有些屬性的值需要去資料庫其他表中獲取,這樣就需要調用其他dao方法得到這個值,然後再set進去。

可是問題來了,如果需要用這種方式賦值的屬性特別多的話,一個一個set進去就需要寫很多set方法,代碼不僅冗餘,而且很麻煩。

於是就想通過反射機制去自動set值。

假設有JavaBean為CreditRatingFile.java類,某些屬性值需要調用CreditRatingFileApplyService類中的方法獲得,並拿到返回值再set出這些屬性。

一、拿到所有JavaBean為CreditRatingFile.java類的屬性

二、拿到多有CreditRatingFileApplyService類的方法

三、匹配之後再根據CreditRatingFile.java的setter方法set對應CreditRatingFileApplyService類方法的返回值

貼出代碼:

 

反射工具類:

package com.krm.modules.creditFileApplay.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.krm.modules.creditFileApplay.model.CreditRatingFile;
import com.krm.modules.creditFileApplay.service.CreditRatingFileApplyService;
import com.thinkgem.jeesite.common.utils.Reflections;


public class ReflectUtil {


@SuppressWarnings("unused")
public static <E> E genValueByGenerics(Class<?> clazz,Class<?> seviceClz,E entity) {
Map<String, Field> resutlMap = new LinkedHashMap<String, Field>();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
resutlMap.put(field.getName(), field);
// System.out.println(field.getName());
//獲取到javaBean中所有屬性後,通過反射機制與service所有方法匹配
String toServiceMethodName = "get"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1, field.getName().length());
if ("getCreditLimit2".equals(toServiceMethodName) || "getCreditRatingLevel3".equals(toServiceMethodName)) {
doServiceMethod(seviceClz,toServiceMethodName,entity,field.getName());
}
}
}
return entity;
}

public static void bianLi(Object obj){
Field[] fields = obj.getClass().getDeclaredFields();
for(int i = 0 , len = fields.length; i < len; i++) {
// 對於每個屬性,獲取屬性名
String varName = fields[i].getName();
try {
// 獲取原來的訪問控制許可權
boolean accessFlag = fields[i].isAccessible();
// 修改訪問控制許可權
fields[i].setAccessible(true);
// 獲取在對象f中屬性fields[i]對應的對象中的變數
Object o;
try {
o = fields[i].get(obj);
System.err.println("傳入的對象中包含一個如下的變數:" + varName + " = " + o);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 恢復訪問控制許可權
fields[i].setAccessible(accessFlag);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
}
}


/**
* 獲得所有方法
* @param clz
* @return
*/
public static List<String> genSetMethodCode(Class<?> clz) {
List<String> setMethods = new ArrayList<>();
Method[] declaredMethods = clz.getDeclaredMethods();
String name = clz.getName();
int dot = name.lastIndexOf(".");
String objName = name.substring(dot+1, dot+2).toLowerCase() + name.substring(dot+2);
for (Method declaredMethod : declaredMethods) {
String methodName = declaredMethod.getName();
setMethods.add(objName + "." + methodName + "();");
}
for (String string : setMethods) {
System.out.println(string);
}
return setMethods;
}

/**
* 獲取指定service類的所有方法,並調用
* @param clz
*/
public static <E> void doServiceMethod(Class<?> clz,String beanAttribute,E entity,String propertyName){
Method[] declaredMethods = clz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
String methodName = declaredMethod.getName();
if (beanAttribute.equals(methodName)) {
reflectMethod(methodName,clz,entity,propertyName);
}
}

}

public static <E> void reflectMethod(String methodName,Class<?> clz,E entity,String propertyName){
try {
//可以傳固定的某個類的具體路徑,也可以傳class的getName()參數。
// Class<?> cls = Class.forName("com.krm.modules.creditFileApplay.service.CreditRatingFileApplyService");/
Class<?> cls = Class.forName(clz.getName());
Object obj = cls.newInstance();
//第一個參數是被調用方法的名稱,後面接著這個方法的形參類型
Class[] argTypes=new Class[1];
argTypes[0]=Map.class;
Method setFunc = cls.getMethod(methodName,argTypes);
//取得方法後即可通過invoke方法調用,傳入被調用方法所在類的對象和實參,對象可以通過cls.newInstance取得
Map<String,Object> map = new HashMap<String,Object>();
//獲取指定方法運行結果
Object result = setFunc.invoke(obj,map);
//調用setter方法
Reflections.invokeSetter(entity, propertyName, result);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
CreditRatingFile entity = new CreditRatingFile();
entity.setCreditLimit3("444");
genValueByGenerics(CreditRatingFile.class, CreditRatingFileApplyService.class,entity);
System.out.println("實體類通過反射機制獲取到的屬性值為:"+entity.getCreditLimit2());
System.out.println("實體類通過反射機制獲取到的屬性值為:"+entity.getCreditRatingLevel3());
System.out.println("實體類通過反射機制獲取到的屬性值為:"+entity.getCreditLimit3());
}
}

 

service類中的方法

public class CreditRatingFileApplyService extends MybatisBaseService<CreditRatingFileApply> {

@Resource
private CreditRatingFileApplyDao creditRatingFileApplyDao;

@Override
public String getTableName() {
return ConfigUtils.getValue("schema.configPlat") + ".CREDIT_RATING_FILE_APPLY";
}

@Override
public String getIdKey() {
return "id";
}

@Override
public MybatisBaseDao<CreditRatingFileApply> getDao() {
return creditRatingFileApplyDao;
}

public List<CreditRatingFileApply> queryByParam(Map<String, Object> params){
return creditRatingFileApplyDao.queryByParam(params);
}

 

public String getHomeValue(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getHomeValue(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getCarName(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getCarName(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getCarNum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getCarNum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getCarValue(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getCarValue(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getAssetSum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getAssetSum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getBusinessAsset1(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getBusinessAsset1(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear1FamilyIncome(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear1FamilyIncome(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear1DebtSum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear1DebtSum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear2FamilyIncome(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear2FamilyIncome(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear2DebtSum(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear2DebtSum(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}
public String getYear3FamilyIncome(Map<String,Object> params){
List<String> list = creditRatingFileApplyDao.getYear3FamilyIncome(params);
if (null != list&&list.size()>0) {
return list.get(0);
}
return "";
}

}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • w2 16、第二周-第02章節-Python3.5-模塊初識 sys模塊 sys.path sys.argv os模塊 os.system os.popen os.mkdir 17、第二周-第03章節-Python3.5-模塊初識2 18、第二周-第04章節-Python3.5-pyc是什麼 19、 ...
  • http://www.cnblogs.com/baixl/p/4170599.html ...
  • gets()函數 因為用gets函數輸入數組時,只知道數組開始處,不知道數組有多少個元素,輸入字元過長,會導致緩衝區溢出,多餘字元可能占用未使用的記憶體,也可能擦掉程式中的其他數據,後續用fgets函數代替。 fgets函數 一小段代碼舉例: (1) fgets函數一次讀入10 - 1個字元,如果少於 ...
  •   傳送文件描述符是高併發網路服務編程的一種常見實現方式。 "Nebula" 高性能通用網路框架即採用了UNIX域套接字傳遞文件描述符設計和實現。本文詳細說明一下傳送文件描述符的應用。 1. TCP伺服器程式設計範式   開發一個伺服器程式,有較多的的程式設計 ...
  • 在學習Celery之前,我先簡單的去瞭解了一下什麼是生產者消費者模式。 生產者消費者模式 在實際的軟體開發過程中,經常會碰到如下場景:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。產生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為 ...
  • 並查集 並查集,在一些有N個元素的集合應用問題中,我們通常是在開始時讓每個元素構成一個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查找一個元素在哪個集合中。這一類問題近幾年來反覆出現在信息學的國際國內賽題中,其特點是看似並不複雜,但數據量極大,若用正常的數據結構來描述的話 ...
  • Description 給定n個正整數a1,a2,…,an,求 的值(答案模10^9+7)。 給定n個正整數a1,a2,…,an,求 的值(答案模10^9+7)。 Input 第一行一個正整數n。 接下來n行,每行一個正整數,分別為a1,a2,…,an。 第一行一個正整數n。 接下來n行,每行一個正 ...
  • 最近爬蟲,爬個貓眼都被封了IP。。 分享幾個常見的User-Agent吧,複製粘貼過來的,謝謝原創。 明天後天,就這周吧,把貓眼,巨潮資訊,陽光網爬一下,然後再爬幾個有漂亮mm的網站,後面再做一個自己的翻譯器。 時間是擠出來的。。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...