Java反射(一)——從查看成員開始

來源:互聯網
上載者:User

標籤:

  工作中遇到了個難題。項目中有很多存放資料的資料類,都是以xxxBean命名的,比如NovelBean,TopicBean。其中有一個最大的HomeTopBean。這個資料類非常龐大,包括了各種成員變數。而前輩往往使用它時,只是把一個JSONObject甩進去。總之JSONObject裡面有的,這個裡面一定都有。JSONObject裡面沒有的,這裡面也有。然後,這個HomeTopBean被傳來傳去,我也不知道它哪些成員有值,哪些成員是Null,哪個成員在中途更新了資料。總之一頭亂麻。

  然後我就想,我一定要找個簡單的方法,能夠在代碼的任何地方去方便地查看這個資料類裡面的所有成員的值。

  首先我找到了第一個知識點。擷取成員的名字。

 Class<?> classType = object.getClass(); Field fields[] = classType.getDeclaredFields(); for(Field field : fields){                            stringBuilder.append(field.getName()).append(":").append("\n"); }

  通過上面的方法,我們可以通過getDeclaredFields獲得一個類所有成員的名字。

  瞬間感覺已經成功了一半了(其實還很遙遠

  接下來是要獲得所有成員的值。

  搜尋一番之後,我發現了一個叫反射的黑科技。具體我還不甚瞭解,日後慢慢研究。但是,我現在知道它有一個功能,可以在代碼中,像拼字串一樣拼出一些方法,並且直接調用。

  天啦嚕,也就是說,我知道類的成員名比如Title , 我可以直接拼接出getTitle的方法,然後調用。也就是說我只需要在HomeTopBean中把setter和getter寫好,我就能用一個foreach來擷取它的所有成員名和成員值。

  方法如下:

package com.dream.fishbonelsy.opentheclass;import android.util.Log;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * Created by fishboneLsy on 2015/6/15. */public class OpenTheStringClass {    public static String getClassString(Object object){        String str = null;        Class<?> classType = object.getClass();        Field fields[] = classType.getDeclaredFields();        StringBuilder stringBuilder = new StringBuilder();        for(Field field : fields){            try {                // 獲得和屬性對應的getXXX()方法                String fieldName = field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);                // 獲得和屬性對應的getXXX()方法的名字                String getMethodName = "get" + fieldName ;//+ fieldName.substring(1);                Log.d("tag" , "fieldName===" + fieldName);                Log.d("tag" , "method name is ===:"+getMethodName);                // 獲得和屬性對應的getXXX()方法                Method getMethod = classType.getMethod(getMethodName, new Class[]{});                // 調用原對象的getXXX()方法                Object value = getMethod.invoke(object, new Object[]{});                if(value!=null) {                    stringBuilder.append(field.getName()).append(":").append(value.toString()).append("\n");                }            } catch (NoSuchMethodException e) {                e.printStackTrace();            } catch (InvocationTargetException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            }        }        str = stringBuilder.toString();        return str;    }}

  這樣就獲得了所有成員的值,暫時到這裡。Done.

Java反射(一)——從查看成員開始

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.