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 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點選開啟連結
由於下班時間已到,就留在明天寫吧,如果道友想了解這部分知識,先儲存下吧~麼麼噠