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点击打开链接


由于下班时间已到,就留在明天写吧,如果道友想了解这部分知识,先保存下吧~么么哒

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值