Android基础之反射

反射是为了提高程序的灵活性,对Java类结构探知的能力。
一篇详细介绍反射的文章:http://www.cyqdata.com/android/article-detail-36281

获取构造方法:

    /**
     * 获取反射类中的构造方法
     * 输出打印格式:"Modifier修饰域   构造方法名(参数类型列表)"
     * 
     * Constructor getConstructor(Class[] params)     根据构造函数的参数,返回一个具体的具有public属性的构造函数
    Constructor getConstructors()     返回所有具有public属性的构造函数数组
    Constructor getDeclaredConstructor(Class[] params)     根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
    Constructor getDeclaredConstructors()    返回该类中所有的构造函数数组(不分public和非public属性)
     */
    public static void get_Reflection_Constructors(ReflectionTest r) {

        Class temp = r.getClass();
        String className = temp.getName();        // 获取指定类的类名

        try {
            Constructor[] theConstructors = temp.getDeclaredConstructors();        // 获取指定类的公有构造方法

            for (int i = 0; i < theConstructors.length; i++) {
                int mod = theConstructors[i].getModifiers();    // 输出修饰域和方法名称
                System.out.print(Modifier.toString(mod) + " " + className + "(");

                Class[] parameterTypes = theConstructors[i].getParameterTypes();    // 获取指定构造方法的参数的集合
                for (int j = 0; j < parameterTypes.length; j++) {    // 输出打印参数列表
                    System.out.print(parameterTypes[j].getName());
                    if (parameterTypes.length > j+1) {
                        System.out.print(", ");
                    }
                }
                System.out.println(")");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

获取类的成员方法:

/**
     * 获取反射类的方法
     * 打印输出格式:"RetType FuncName(paramTypeList)"
     * 
     * Method getMethod(String name, Class[] params)    根据方法名和参数,返回一个具体的具有public属性的方法
    Method[] getMethods()    返回所有具有public属性的方法数组
    Method getDeclaredMethod(String name, Class[] params)    根据方法名和参数,返回一个具体的方法(不分public和非public属性)
    Method[] getDeclaredMethods()    返回该类中的所有的方法数组(不分public和非public属性)
     */
    public static void get_Reflection_Method(ReflectionTest r) {

        Class temp = r.getClass();
        String className = temp.getName();

        /*
         * Note: 方法getDeclaredMethods()只能获取到由当前类定义的所有方法,不能获取从父类继承的方法
         *                  方法getMethods() 不仅能获取到当前类定义的public方法,也能得到从父类继承和已经实现接口的public方法
         * 请查阅开发文档对这两个方法的详细描述。
         */
        //Method[] methods = temp.getDeclaredMethods();
        Method[] methods = temp.getMethods();

        for (int i = 0; i < methods.length; i++) {

            // 打印输出方法的修饰域
            int mod = methods[i].getModifiers();
            System.out.print(Modifier.toString(mod) + " ");

            // 输出方法的返回类型
            System.out.print(methods[i].getReturnType().getName());    

            // 获取输出的方法名
            System.out.print(" " + methods[i].getName() + "(");

            // 打印输出方法的参数列表
            Class[] parameterTypes = methods[i].getParameterTypes();
            for (int j = 0; j < parameterTypes.length; j++) {
                System.out.print(parameterTypes[j].getName());
                if (parameterTypes.length > j+1) {
                    System.out.print(", ");
                }
            }
            System.out.println(")");
        }
    }

获取类的成员变量:

    /**
     * 获取反射类中的属性和属性值
     * 输出打印格式:"Modifier Type : Name = Value"
     * Note: 对于未初始化的指针类型的属性,将不输出结果
     * 
     * Field getField(String name)    根据变量名,返回一个具体的具有public属性的成员变量
    Field[] getFields()    返回具有public属性的成员变量的数组
    Field getDeclaredField(String name)    根据变量名,返回一个成员变量(不分public和非public属性)
    Field[] getDelcaredField()    返回所有成员变量组成的数组(不分public和非public属性)
     */
    public static void get_Reflection_Field_Value(ReflectionTest r) {

        Class temp = r.getClass();    // 获取Class类的对象的方法之一

        try {
            Field[] fa = temp.getDeclaredFields();
            for (int i = 0; i < fa.length; i++) {

                Class cl = fa[i].getType();    // 属性的类型

                int md = fa[i].getModifiers();    // 属性的修饰域

                Field f = temp.getDeclaredField(fa[i].getName());    // f = fa[i]
                f.setAccessible(true);    // 设置是否可访问
                Object value = (Object) f.get(r);

                if (value == null) {
                    System.out.println(Modifier.toString(md) + " " + cl + " : " + fa[i].getName());
                }
                else {
                    System.out.println(Modifier.toString(md) + " " + cl + " : " + fa[i].getName() + " = " + value.toString());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值