激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Android - 詳解Java編程中的反射在Android開發(fā)中的應(yīng)用

詳解Java編程中的反射在Android開發(fā)中的應(yīng)用

2021-03-28 18:01低調(diào)小一 Android

這篇文章主要介紹了詳解Java編程中的反射在Android開發(fā)中的應(yīng)用,主要來獲取安卓系統(tǒng)的屬性值,需要的朋友可以參考下

反射定義

“反射”(Reflection)能夠讓運(yùn)行于JVM中的程序檢測和修改運(yùn)行時的行為。
為何需要反射

反射帶來的好處包括:

  •     在運(yùn)行時檢測對象的類型。
  •     動態(tài)構(gòu)造某個類的對象。
  •     檢測類的屬性和方法。
  •     任意調(diào)用對象的方法。
  •     修改構(gòu)造函數(shù)、方法、屬性的可見性。

反射方法Method
getDeclaredMethod方法

聲明如下:

?
1
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方法

聲明如下:

?
1
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è)我們要反射的方法有4個參數(shù),函數(shù)原型如下:

?
1
public void printInfo(String str, int iNum, double dNum, long i);

那我們通過返回獲取這個Method對象的時候,傳的parameterTypes如下所示:

?
1
getMethod("printInfo", String.class, int.class, double.class, long.class);


所以,parameterTypes其實就是對方法形參的類型抽象。
invoke方法

聲明如下:

?
1
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源碼中查看一下這個類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
{
  // 省略具體實現(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方法。具體實現(xiàn)源碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
 }
 
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费黄网站在线播放 | 国产精品爆操 | 亚洲自拍第二页 | 婷婷一区二区三区 | 成人在线视频黄色 | 中文字幕在线观看精品 | 久久激情小视频 | 国产在线第一 | 麻豆国产网站 | 久久av免费观看 | 欧美特黄特色视频 | 国产免费人做人爱午夜视频 | 成人一级片毛片 | 欧美亚州 | 亚洲男人的天堂在线视频 | 国产精品久久久不卡 | 看91| 日韩黄色免费在线观看 | jizzjizzjizzjizz国产 | 亚洲一区二区三区日本久久九 | 在线免费av观看 | 久久网一区二区 | 老师你怎么会在这第2季出现 | 国产精品成人一区二区三区吃奶 | 超久久 | 婷婷久久久久久 | 久久91久久久久麻豆精品 | chinese乱子伦xxxx国语对白 | 亚洲午夜网站 | 国产一区国产二区在线观看 | 免费看成人毛片 | 牛牛热这里只有精品 | 91精品国产刺激国语对白 | 草久影院| 欧美精品一二三区 | 一级黄色欧美 | 一级电影在线免费观看 | 欧美日韩后 | 美女视频黄视大全视频免费网址 | 欧美一区二区三区久久精品视 | 特级无码毛片免费视频尤物 |