詳解Java編程中的反射在Android開發(fā)中的應(yīng)用
反射定義
“反射”(Reflection)能夠讓運(yùn)行于JVM中的程序檢測和修改運(yùn)行時的行為。
為何需要反射
反射帶來的好處包括:
- 在運(yùn)行時檢測對象的類型。
- 動態(tài)構(gòu)造某個類的對象。
- 檢測類的屬性和方法。
- 任意調(diào)用對象的方法。
- 修改構(gòu)造函數(shù)、方法、屬性的可見性。
反射方法Method
getDeclaredMethod方法
聲明如下:
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
解釋:
返回一個Method對象,該對象反映此Class對象所表示的類或接口的指定已聲明方法。
1. name : 是一個String,它指定所需方法的簡稱。
2. parameterTypes:是一個Class對象的變長數(shù)組,它按聲明順序標(biāo)識該方法的形參類型。
注意:
getDeclaredMethod獲取該類聲明的public方法或者protected方法,但是不包括繼承的方法。
getMethod方法
聲明如下:
public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
解釋:
返回一個Method對象,該對象反映此Class對象所表示的類或接口的指定公共成員方法。
1. name : 是一個String,它指定所需方法的簡稱。
2. parameterTypes:是一個Class對象的變長數(shù)組,它按聲明順序標(biāo)識該方法的形參類型。
參數(shù)解釋
name參數(shù)就不需要解釋了,就是調(diào)用類的方法名稱。
可能很多同學(xué)剛接觸這個方法的時候,會對parameterTypes參數(shù)產(chǎn)生疑問,例如這個參數(shù)為什么是Class泛型變長數(shù)組,其實(shí)舉個例子就很好理解了。
假設(shè)我們要反射的方法有4個參數(shù),函數(shù)原型如下:
public void printInfo(String str, int iNum, double dNum, long i);
那我們通過返回獲取這個Method對象的時候,傳的parameterTypes如下所示:
getMethod("printInfo", String.class, int.class, double.class, long.class);
所以,parameterTypes其實(shí)就是對方法形參的類型抽象。
invoke方法
聲明如下:
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
解釋:
Method類的invoke(Object obj, Object… args)方法接收的參數(shù)必須為對象。其中:
1. obj : 從中調(diào)用底層方法的對象。
2. args :用于方法調(diào)用的參數(shù)。
Android 反射應(yīng)用
我們知道,Android有些類是沒有在SDK中開放的,例如你需要獲取系統(tǒng)屬性,需要調(diào)用到SystemProperties類的get方法,但是這個類并沒有在SDK中公開,我們可以在Android源碼中查看一下這個類:
package android.os; import java.util.ArrayList; import android.util.Log; /** * Gives access to the system properties store. The system properties * store contains a list of string key-value pairs. * * {@hide} */ public class SystemProperties { // 省略具體實(shí)現(xiàn)代碼 /** * Get the value for the given key. * @return an empty string if the key isn't found * @throws IllegalArgumentException if the key exceeds 32 characters */ public static String get(String key) { if (key.length() > PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get(key); } }
可以看到,這個前面有一個@hide標(biāo)簽,所以這個類是沒法直接在代碼中調(diào)用的。
但是,在Android應(yīng)用中,很多時候我們需要獲取到手機(jī)類型屬性(ro.product.model)。所以,這個時候,我們就需要在應(yīng)用層反射SystemProperties類,調(diào)用get方法。具體實(shí)現(xiàn)源碼如下:
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.util.Log; public class SystemProperties { public static String get(String key) { String value = ""; Class<?> cls = null; try { cls = Class.forName("android.os.SystemProperties"); Method hideMethod = cls.getMethod("get", String.class); Object object = cls.newInstance(); value = (String) hideMethod.invoke(object, key); } catch (ClassNotFoundException e) { Log.e("zhengyi.wzy", "get error() ", e); } catch (NoSuchMethodException e) { Log.e("zhengyi.wzy", "get error() ", e); } catch (InstantiationException e) { Log.e("zhengyi.wzy", "get error() ", e); } catch (IllegalAccessException e) { Log.e("zhengyi.wzy", "get error() ", e); } catch (IllegalArgumentException e) { Log.e("zhengyi.wzy", "get error() ", e); } catch (InvocationTargetException e) { Log.e("zhengyi.wzy", "get error() ", e); } return value; } }
相關(guān)文章
詳細(xì)介紹Android中的視圖焦點(diǎn)Focus的使用
本篇文章主要介紹了詳細(xì)介紹Android中的視圖焦點(diǎn)Focus的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Android 本地廣播和強(qiáng)制下線功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 本地廣播和強(qiáng)制下線功能的實(shí)現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Android Walker登錄記住密碼頁面功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android Walker登錄記住密碼頁面功能的實(shí)現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05Android7.0行為變更之適配File Provider的方法
這篇文章主要介紹了Android7.0行為變更之適配File Provider的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04關(guān)于ADB的Android Debug Bridge(安卓調(diào)試橋)那些事
這篇文章主要介紹了關(guān)于ADB的Android Debug Bridge(安卓調(diào)試橋)那些事,需要的朋友可以參考下2019-10-10Android 自定義imageview實(shí)現(xiàn)圖片縮放實(shí)例詳解
這篇文章主要介紹了Android 自定義imageview實(shí)現(xiàn)圖片縮放實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04