身為android猿,反射何時(shí)用

在上一篇文章咱們一起來探討Java的反射吧,探討了一下java的反射。但是
反射,好像大家總是提,但是作為android程序猿,好像反射很少用得到,而且反射會(huì)影響性能。所以愚蠢的我提出了這些疑問:反射用來干嘛?什么時(shí)候用到反射呢?

一.反射用來干嘛?
  1. 反射構(gòu)建出無法直接訪問的類
  • set或get到無法訪問的類變量
  • 調(diào)用不可訪問的方法
二.什么時(shí)候用到反射呢?

首先我們明確,在日常開發(fā)中盡量不要用反射,除非遇到了必須要通過反射才能調(diào)用的方法。比如我在做一個(gè)下拉通知中心功能的時(shí)候就遇到了這樣的情況。系統(tǒng)沒有提供api,所以我們只能通過反射進(jìn)行調(diào)用

三.案例一

需求:我們通過app可以顯示或者取消狀態(tài)欄
分析:statusBar的實(shí)例對象可以通過systemservice獲取,通過打開android的doc源碼得知statusBar的顯示是調(diào)用了expand方法名的方法(不同sdk方法不同),取消調(diào)用了collapse方法名的方法(不同sdk方法不同),所以編碼如下:

/** * 顯示消息中心 */ 
public static void openStatusBar(Context mContext) { 
      // 判斷系統(tǒng)版本號(hào)
      String methodName = (VERSION.SDK_INT <= 16) ? "expand":"expandNotificationsPanel"; 
      doInStatusBar(mContext, methodName); 
} 
/** * 關(guān)閉消息中心 */
 public static void closeStatusBar(Context mContext) { 
// 判斷系統(tǒng)版本號(hào)
       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:大家應(yīng)該在使用反射時(shí),總是覺得反射使用較復(fù)雜,該如何簡化呢?國外大神寫了框架jOOR,一行代碼就可以搞定

案例二

Java提供了注解Annotation類,其實(shí)我也可以通過注解獲取到這個(gè)對象

  1. <A extends Annotation>A getAnnotation(Class<A>annotationClass):嘗試獲取該class對象對應(yīng)類上村子的指定類型的Annotation,如果該類型注解不存在,則返回null
  • <A extends Annotation>A getDeclaredAnnotation(Class<A>annotationClass):這是Java 8中新增的,該方法獲取直接修飾該class對象對應(yīng)類的指定類型的Annotation,如果不存在,則返回null
  • Annotation[] getAnnotations():返回修飾該class對象對應(yīng)類上存在的所有Annotation
  • Annotation[] getDeclaredAnnotations():返回修飾該Class對象對應(yīng)類上存在的所有Annotation
  • <A extends Annotation>A[] getAnnotationByType(Class<A>annotationClass):該方法的功能與前面介紹的getAnnotation()方法基本相似,但由于Java8增加了重復(fù)注解功能,因此需要使用該方法獲取修飾該類的指定類型的多個(gè)Annotation
  • <A extends Annotation>A[] getDeclaredAnnotationByType(Class<A>annotationClass):該方法發(fā)功能與前面介紹的getDeclaredAnnotations()方法相似,也是因?yàn)镴ava8的重復(fù)注解的功能,需要使用該方法獲取直接修飾該類的指定類型的多個(gè)Annotation

再寫注解框架時(shí),就會(huì)用到反射。在這里我就不細(xì)講了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容