在上一篇文章咱们一起来探讨Java的反射吧,探讨了一下java的反射。但是
反射,好像大家总是提,但是作为android程序猿,好像反射很少用得到,而且反射会影响性能。所以愚蠢的我提出了这些疑问:反射用来干嘛?什么时候用到反射呢?
一.反射用来干嘛?
- 反射构建出无法直接访问的类
- 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类,其实我也可以通过注解获取到这个对象
- <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
再写注解框架时,就会用到反射。在这里我就不细讲了。
网友评论