最近项目中因为用到的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点击打开链接
由于下班时间已到,就留在明天写吧,如果道友想了解这部分知识,先保存下吧~么么哒