1. 程式人生 > >Java反射機制的原理及在Android下的簡單應用

Java反射機制的原理及在Android下的簡單應用

package crazypebble.reflectiontest;import java.lang.reflect.Constructor;import java.lang.reflect.Method;publicclass 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; } elseif (types[i].equals("float") || types[i].equals("Float")) { cs[i] = Float.TYPE; } elseif (types[i].equals("double") || types[i].equals("Double")) { cs[i] = Double.TYPE; } elseif (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]); } elseif(types[i].equals("float")||types[i].equals("Float")){ retObjects[i]=new Float(params[i]); } elseif(types[i].equals("double")||types[i].equals("Double")){ retObjects[i]=new Double(params[i]); } elseif(types[i].equals("boolean")||types[i].equals("Boolean")){ retObjects[i]=new Boolean(params[i]); } else{ retObjects[i] = params[i]; } } } return retObjects; }}