美文网首页
身为android猿,反射何时用

身为android猿,反射何时用

作者: 墨源为水 | 来源:发表于2016-06-15 23:05 被阅读689次

    在上一篇文章咱们一起来探讨Java的反射吧,探讨了一下java的反射。但是
    反射,好像大家总是提,但是作为android程序猿,好像反射很少用得到,而且反射会影响性能。所以愚蠢的我提出了这些疑问:反射用来干嘛?什么时候用到反射呢?

    一.反射用来干嘛?
    1. 反射构建出无法直接访问的类
    • set或get到无法访问的类变量
    • 调用不可访问的方法
    二.什么时候用到反射呢?

    首先我们明确,在日常开发中尽量不要用反射,除非遇到了必须要通过反射才能调用的方法。比如我在做一个下拉通知中心功能的时候就遇到了这样的情况。系统没有提供api,所以我们只能通过反射进行调用

    三.案例一

    需求:我们通过app可以显示或者取消状态栏
    分析:statusBar的实例对象可以通过systemservice获取,通过打开android的doc源码得知statusBar的显示是调用了expand方法名的方法(不同sdk方法不同),取消调用了collapse方法名的方法(不同sdk方法不同),所以编码如下:

    /** * 显示消息中心 */ 
    public static void openStatusBar(Context mContext) { 
          // 判断系统版本号
          String methodName = (VERSION.SDK_INT <= 16) ? "expand":"expandNotificationsPanel"; 
          doInStatusBar(mContext, methodName); 
    } 
    /** * 关闭消息中心 */
     public static void closeStatusBar(Context mContext) { 
    // 判断系统版本号
           String methodName = (VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels"; 
           doInStatusBar(mContext, methodName); 
    }
    private static void doInStatusBar(Context mContext, String methodName){        
           try { 
                 Object service = mContext.getSystemService("statusbar"); 
                 Method expand = service.getClass().getMethod(methodName);
                 expand.invoke(service); 
           } catch (Exception e) { 
                e.printStackTrace(); 
           } 
    }
    

    Tips:大家应该在使用反射时,总是觉得反射使用较复杂,该如何简化呢?国外大神写了框架jOOR,一行代码就可以搞定

    案例二

    Java提供了注解Annotation类,其实我也可以通过注解获取到这个对象

    1. <A extends Annotation>A getAnnotation(Class<A>annotationClass):尝试获取该class对象对应类上村子的指定类型的Annotation,如果该类型注解不存在,则返回null
    • <A extends Annotation>A getDeclaredAnnotation(Class<A>annotationClass):这是Java 8中新增的,该方法获取直接修饰该class对象对应类的指定类型的Annotation,如果不存在,则返回null
    • Annotation[] getAnnotations():返回修饰该class对象对应类上存在的所有Annotation
    • Annotation[] getDeclaredAnnotations():返回修饰该Class对象对应类上存在的所有Annotation
    • <A extends Annotation>A[] getAnnotationByType(Class<A>annotationClass):该方法的功能与前面介绍的getAnnotation()方法基本相似,但由于Java8增加了重复注解功能,因此需要使用该方法获取修饰该类的指定类型的多个Annotation
    • <A extends Annotation>A[] getDeclaredAnnotationByType(Class<A>annotationClass):该方法发功能与前面介绍的getDeclaredAnnotations()方法相似,也是因为Java8的重复注解的功能,需要使用该方法获取直接修饰该类的指定类型的多个Annotation

    再写注解框架时,就会用到反射。在这里我就不细讲了。

    相关文章

      网友评论

          本文标题:身为android猿,反射何时用

          本文链接:https://www.haomeiwen.com/subject/gqopdttx.html