標籤:
工作中遇到了個難題。項目中有很多存放資料的資料類,都是以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反射(一)——從查看成員開始