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();
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章