一直感覺java的反射機制很強大,但是可用的地方不多。在android學習的時候,一直想實作挂斷電話的功能,但是系統并沒有提供開放的api接口,看了一下網上使用反射機制來實作該功能,确實很強大,很實用。
今天在對應的web開發中,用戶端需要送出參數給伺服器,自己已經寫好了對應的bean檔案,但是每一次都需要就其内部的key-value進行拼接,比較麻煩,突然想起了了反射機制,嘗試了一下,确實非常的好用。下面看一下代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Bean { String name ; String property ; public String getName ( ) { return name ; } public void setName ( String name ) { this. name = name ; } public String getProperty ( ) { return property ; } public void setProperty ( String property ) { this. property = property ; } } |
上面是一個Bean類,有2個屬性,在請求伺服器時,我需要将其拼接為name=xxx&property=xxx,一個還好,很多這樣的憑借就需要将其抽象出來了,下面使用反射機制對其拼接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import java.io.UnsupportedEncodingException ; import java.lang.reflect.Field ; import java.net.URLEncoder ; import java.util.HashMap ; import java.util.Map ; public class ParamsUtil { public static void main ( String [ ] args ) throws IllegalArgumentException, IllegalAccessException, UnsupportedEncodingException { //設定屬性 Bean bean = new Bean ( ) ; bean. setName ( "blog.androiddevelop.cn" ) ; bean. setProperty ( "master" ) ; //擷取所有變量 Field [ ] fields = bean. getClass ( ). getDeclaredFields ( ) ; StringBuffer sb = new StringBuffer ( "" ) ; for ( int i = 0 ; i < fields. length ; i ++ ) { sb. append (fields [i ]. getName ( ) ) ; sb. append ( "=" ) ; sb. append ( URLEncoder. encode ( String. valueOf (fields [i ]. get (bean ) ), "UTF-8" ) ) ; if (i < fields. length - 1 ) sb. append ( "&" ) ; } System. out. println (sb. toString ( ) ) ; } } |
這樣下來就将參數進行了拼接。當然,這樣也有一定的弊端,要處理的對象裡面的變量不能是很複雜的類型。
更多文章請前往小胖軒.