1. 程式人生 > >android 淺談反射機制

android 淺談反射機制

最近專案中因為用到的switch case  分支太多,就想著把他替換掉,直接把資料反射到一個對應類中去處理(也可以先放在map集合中),研究了一天總算明白個大概,並且簡單的實現了邏輯,那麼就簡單記錄一下吧。

首先要用反射機制,就要知道什麼是反射?為什麼要用反射?反射的利與弊?,問題有了那麼我們就開始針對問題簡單說明

1.反射的最主要的作用,是用於強行訪問正常途徑沒有訪問許可權的程式碼,在知道目標類的類名和方法名的情況下可以使用。

2.反射可以避免編寫重複的方法和域,從而減少程式碼在記憶體上展開後佔據的空間。但大多數情況下一個方法佔據的空間都不大,所以節省量相當有限。

3.然而使用反射的話,既會降低程式碼的可讀性,同時由於繞過了JAVA的程式碼訪問許可權,也容易留下安全漏洞。因此除非實在有必要,無法繞開,都儘量不建議使用反射機制。

言歸正傳 ,這裡有簡單說明怎麼實現反射

首先,先定義一個反射類,和類中的方法

public class Operatorcontact implements BaseClass {
    @Override
    public void getAllData(String str1, String str2, String str3, boolean b, String str4, String str5) {

    }
  }

其次   設定方法的型別和引數,用陣列裝起來

   String[] mTypes = {"String", "String", "String", "boolean", "String", "String"};

   String[] mParams = {str1, str2, str3, b+ "", str14, str15};

   String cName = toUpperCaseFirstOne(backSceneId);//Class的類名
   LoadMethod loadMethod = new LoadMethod();
   loadMethod.Load("com.android.xxxxxxxx." + cName, "getAllData", mTypes, mParams);//  所在類的位置,方法,和型別 ,引數

所需要的 LoadMethod類

public class LoadMethod {
    /**
     * 在執行時載入指定的類,並呼叫指定的方法
     *
     * @param cName      Java的類名
     * @param MethodName 方法名
     * @param types      方法的引數型別
     * @param params     方法的引數值
     * @return
     */
    public Object Load(String cName, String MethodName, String[] types, String[] params) {


        Object retObject = null;


        try {
            // 載入指定的類
            Class cls = Class.forName(cName);    // 獲取Class類的物件的方法之二


            // 利用newInstance()方法,獲取構造方法的例項
            // Class的newInstance方法只提供預設無參構造例項
            // Constructor的newInstance方法提供帶參的構造例項
            Constructor ct = cls.getConstructor(null);
            Object obj = ct.newInstance(null);
            //Object obj = cls.newInstance();


            // 構建 方法的引數型別
            Class paramTypes[] = this.getMethodTypesClass(types);


            // 在指定類中獲取指定的方法
            Method meth = cls.getMethod(MethodName, paramTypes);


            // 構建 方法的引數值
            Object argList[] = this.getMethodParamObject(types, params);


            // 呼叫指定的方法並獲取返回值為Object型別
            retObject = meth.invoke(obj, argList);


        } catch (Exception e) {
            System.err.println(e);
        }


        return retObject;
    }


    /**
     * 獲取引數型別,返回值儲存在Class[]中
     */
    public Class[] getMethodTypesClass(String[] types) {
        Class[] cs = new Class[types.length];


        for (int i = 0; i < cs.length; i++) {
            if (types[i] != null || !types[i].trim().equals("")) {
                if (types[i].equals("int") || types[i].equals("Integer")) {
                    cs[i] = Integer.TYPE;
                } else if (types[i].equals("float") || types[i].equals("Float")) {
                    cs[i] = Float.TYPE;
                } else if (types[i].equals("double") || types[i].equals("Double")) {
                    cs[i] = Double.TYPE;
                } else if (types[i].equals("boolean") || types[i].equals("Boolean")) {
                    cs[i] = Boolean.TYPE;
                } else {
                    cs[i] = String.class;
                }
            }
        }
        return cs;
    }


    /**
     * 獲取引數Object[]
     */
    public Object[] getMethodParamObject(String[] types, String[] params) {


        Object[] retObjects = new Object[params.length];


        for (int i = 0; i < retObjects.length; i++) {
            if (!params[i].trim().equals("") || params[i] != null) {
                if (types[i].equals("int") || types[i].equals("Integer")) {
                    retObjects[i] = new Integer(params[i]);
                } else if (types[i].equals("float") || types[i].equals("Float")) {
                    retObjects[i] = new Float(params[i]);
                } else if (types[i].equals("double") || types[i].equals("Double")) {
                    retObjects[i] = new Double(params[i]);
                } else if (types[i].equals("boolean") || types[i].equals("Boolean")) {
                    retObjects[i] = new Boolean(params[i]);
                } else {
                    retObjects[i] = params[i];
                }
            }
        }


        return retObjects;
    }
}

想深入瞭解學習請參考http://www.cyqdata.com/android/article-detail-36281點選開啟連結

由於下班時間已到,就留在明天寫吧,如果道友想了解這部分知識,先儲存下吧~麼麼噠