工作中遇到了个难题。项目中有很多存放数据的数据类,都是以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.