在上一篇文章咱們一起來探討Java的反射吧销钝,探討了一下java的反射。但是
反射琐簇,好像大家總是提蒸健,但是作為android程序猿,好像反射很少用得到鸽嫂,而且反射會(huì)影響性能纵装。所以愚蠢的我提出了這些疑問:反射用來干嘛?什么時(shí)候用到反射呢据某?
一.反射用來干嘛橡娄?
- 反射構(gòu)建出無法直接訪問的類
- set或get到無法訪問的類變量
- 調(diào)用不可訪問的方法
二.什么時(shí)候用到反射呢?
首先我們明確癣籽,在日常開發(fā)中盡量不要用反射挽唉,除非遇到了必須要通過反射才能調(diào)用的方法。比如我在做一個(gè)下拉通知中心功能的時(shí)候就遇到了這樣的情況筷狼。系統(tǒng)沒有提供api瓶籽,所以我們只能通過反射進(jìn)行調(diào)用
三.案例一
需求:我們通過app可以顯示或者取消狀態(tài)欄
分析:statusBar的實(shí)例對(duì)象可以通過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è)對(duì)象
- <A extends Annotation>A getAnnotation(Class<A>annotationClass):嘗試獲取該class對(duì)象對(duì)應(yīng)類上村子的指定類型的Annotation竖独,如果該類型注解不存在裤唠,則返回null
- <A extends Annotation>A getDeclaredAnnotation(Class<A>annotationClass):這是Java 8中新增的,該方法獲取直接修飾該class對(duì)象對(duì)應(yīng)類的指定類型的Annotation莹痢,如果不存在种蘸,則返回null
- Annotation[] getAnnotations():返回修飾該class對(duì)象對(duì)應(yīng)類上存在的所有Annotation
- Annotation[] getDeclaredAnnotations():返回修飾該Class對(duì)象對(duì)應(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ì)講了。