Java反射(一)——从查看成员开始

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

时间: 2024-08-02 11:01:35

Java反射(一)——从查看成员开始的相关文章

通过Java反射测试类私有成员

在Java开发阶段,因为追求架构规范和遵循设计原则,所以要用private和protected修饰符去定义类的成员方法.变量.常量,这使得代码具封装性.内聚性等,但在测试阶段会造成一定的不便.通过Java的反射机制,便能很好地解决该问题. ReflectUtil.java //...... /** * @author yumin * @since 2015-03-02 14:52 */ public class ReflectUtil { private ReflectUtil() { } //

通过Java反射测试类私有成员(新)

http://my.oschina.net/wangyumin/blog/387627续上篇反射方式调用私有成员,最近对该方法进行了二次封装. ReflectUtil.java //部份代码略 /** * Invoking method plus * * @param object Java object * @param methodName 方法名称 * @param args 入参对象 * @return 执行结果对象 */ public static Object invokeMetho

Java反射-修改private final成员变量值,你知道多少?

大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明.  基本数据类型 String类型 Integer类型 总结 首先看下对基本类型的修改: /** * @author Cool-Coding 2018/5/15 */ public class ReflectionUsage {private final int age=18; public int getAge(){ return

java 反射获取设置私有成员变量的值

for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicationCode =null; try { applicationCode =argClass.getDeclaredField("applicationCode"); }catch (NoSuchFieldException e){ } JWTData jwtData = CurrentU

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

[转载] Java反射机制的学习

本文转载自: http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Ja

Java反射机制可以动态修改实例中final修饰的成员变量吗?

问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. 2. 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能通过java反射机制来动态修改它的值. 实验: 1. 当final修饰的成员变量在定义的时候就初始化了值 1 public Class Person { 2 private final String name = "damon

Java反射理解(四)-- 获取成员变量构造函数信息

Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装了关于成员变量的操作: getFields() 方法获取的是所有的public的成员变量的信息 getDeclaredFields() 获取的是该类自己声明的成员变量的信息 getType() 得到成员变量的类型的类类型 getName() 得到成员变量的名称 获取成员变量构造函数信息: obj.g

【Java】+反射1+获取属性/成员变量 的名称及类型

扩展链接:[Java]+反射2+设置属性/成员变量 的值 1.目标类 2.获取目标群类中的属性及属性的类型 3.代码 1 @Test 2 public void testA() { 3 Class clazz = ZGXRequest.class; 4 // step1 获取类中所有的属性 5 Field[] fields = clazz.getDeclaredFields(); 6 for (Field field : fields) { 7 // step2 获取每个属性的类型(以点分割 需

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的