身为android猿,反射何时用

在上一篇文章咱们一起来探讨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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容