天天看點

反射模拟DbUtils實作ResultSet轉成Bean執行個體

前幾天接觸到了<code>apache</code>的一個小架構<code>DbUtils</code>,真的被其優雅的設計所震撼到了,尤其是其中的

當時真的是感覺到很是神奇,僅僅是指定了一下那個Bean類的全名,就能從資料庫結果集中自動的生成我們需要的Bean對象,真的是太優雅了。然後我就翻了翻源碼,然後尴尬的發現自己能力有限,并不能真正做出那樣強大而且優雅的東西。

雖然寫不了那樣強大的架構,但是模拟一下還是可行的嘛,我在源碼中看到了反射技術的影子,然後就惡補了一下相關的知識點。細節方面主要是使用到了<code>PropertyDescriptor</code>這個類,以及相關的<code>getReadMethod</code>和<code>getWriteMethod</code>。說白了就是實作setter和getter方法。

下面是一個簡單的入門級的小例子

經過了上面的小例子,那我們就具備了給單個的<code>Property</code>指派的實作了,至于怎麼給一個Bean的所有的<code>Property</code>指派,請接着往下看。

<code>beanClass.getDeclaredFields()</code>.有了這行代碼,我們就可以接着下一步了。

為了接下來的測試成功,我們先new出來幾個Bean吧。分别如下:

接下來就是重頭戲了。

下面就來一起看看振奮人心的結果吧。

反射技術對于泛型的使用可謂是登峰造極了。這樣做的好處不言而喻。

今天代碼中的閃光點在于:

<code>String.subString();</code> // 分割字元串,實作bean的全名轉化成可反射的字元串類型

<code>Map&lt;String,Object&gt;</code>的使用,好處在于模拟了<code>ResultSet</code>,提供了素材

<code>Class&lt;T&gt; bean</code>的使用,神奇的一種方式啊。泛型的優點可不僅僅在這裡能看到啊。:-)

好了,今天的分享就先到這裡吧。希望這個思路能給看到這篇文章的童鞋一絲啟發,開發出專屬于自己的一套小工具。