天天看點

BeanUtils源碼分析及其使用

在文章開頭我還得回想回想我當時從前台接收資料的艱辛曆程,一行行的get

Parameter看這都心裡犯狠,這些沒有任何技術含量的事要做這麼多遍,後來呢我就發現了getParameterMap這個API(有點尴尬),就自己寫了個周遊的工具類,但是故事并不是這麼完美的,因為我要new 一個bean給它指派,然後我就又開始了我的艱辛曆程了(說多了都是淚),我當時就在想有沒有什麼方法讓我從這解放出來呢(當時可不太懂這個怎麼寫),放寒假了就圓圓我當時的夢想吧哈哈畢竟以後用的地方還多着勒。

還是老規矩對它先進行一頓原理分析:
1.先用增強的for把全部的鍵值對周遊出來,注意Value要用數組來裝,因為如果是多選的話一個肯定是不夠的。
2.利用反射拿到bean的所有	方法,和第一步取出來的keyset比對,如果一樣的話就調用set方法
3.如果資料類型是日期類型,要轉化為标準的日期類型,否則會報錯,我的調試如下(這一步不能固定在方法裡,因為日期類型的分隔符不确定)
           

我開始實作的時候沒注意Date類型的資料導緻出錯

這個是沒有時間類型的,運作結果如下是正确的

BeanUtils源碼分析及其使用

這個是有時間類型的,會報錯,那麼怎麼解決呢

BeanUtils源碼分析及其使用
然後我加上了時間轉換器,但是還是這個錯誤,然後我仔細觀察了下錯誤,然後發現是我的bean裡的Date導包導錯了,要是util下的Data。下邊就是我成功的圖檔
在這裡插入圖檔描述
           
BeanUtils源碼分析及其使用

實作方式

1.傳入參數obj,可以将bean對象傳進去,利用Date包建立一個時間轉換器再用beannutils下的convertutil注冊,然後調用beanutil的populate方法

public static void populate(Object obj, Map<String, String[]> map) {
		try {
			// 手動向BeanUtils注冊一個時間類型轉換器
			// 建立時間類型的轉換器
			DateConverter dt = new DateConverter();
			// 設定轉換的格式
			dt.setPattern("yyyy-MM-dd");
			// 注冊轉換器
			ConvertUtils.register(dt, java.util.Date.class);
			BeanUtils.populate(obj, map);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
           

2.傳入bean的類,利用反射擷取到bean對象,利用泛型實作bean的反射對象的傳回,到這不得不說反射是真的強大啊,隻有隐式的和無參的才能用newInstence()

public static<T> T  populate(Class<T> clazz, Map<String, String[]> map) {
		try {
			
			T obj=clazz.newInstance();
			//手動向BeanUtils注冊一個時間類型轉換器
			// 1_建立時間類型的轉換器
			DateConverter dt = new DateConverter();
			// 2_設定轉換的格式
			dt.setPattern("yyyy-MM-dd");
			// 3_注冊轉換器
			ConvertUtils.register(dt, java.util.Date.class);
			BeanUtils.populate(obj, map);
			return obj;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}		
	}
           

恭喜你看到了最後,相信你收獲一定很多吧哈哈,滿滿的幹貨,準備周全才能在開發中有更好的遊戲體驗不是嘛。圓夢了圓夢了哈哈。