91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java反射庫怎么實現

發布時間:2022-03-11 17:25:04 來源:億速云 閱讀:157 作者:iii 欄目:web開發

這篇“Java反射庫怎么實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java反射庫怎么實現”文章吧。

在Java和Android中,我們常常會使用反射來達到一些兼容的目的。Java原生提供的反射很是麻煩,使用起來很是不方便。比如我們想要調UserManager的靜態方法get,使用原生的實現如下

try {

 final Method m = UserManager.class.getMethod("get", Context.class);

 m.setAccessible(true);

 m.invoke(null, this);

} catch (NoSuchMethodException e) {

 e.printStackTrace();

} catch (IllegalAccessException e) {

 e.printStackTrace();

} catch (InvocationTargetException e) {

 e.printStackTrace();

}

實現起來好不麻煩。這其中

需要確定方法名和參數來獲取對應的Method對象

設置Method對象的assessible為true

調用invoke方法,并且傳入對應的參數

捕獲其中可能拋出來的一連串異常

那么反射能簡單點么,當然,而且還會簡單很多。

這就是本文想要介紹的,jOOR(Java Object Oriented Reflection),它是一個對java.lang.reflect包的簡單封裝,使得我們使用起來更加直接和方便。

使用jOOR,上面的代碼可以縮短成一行。

Reflect.on(UserManager.class).call("get", getApplicationContext());

依賴

jOOR沒有依賴。

API介紹

Reflect

Reflect.on 包裹一個類或者對象,表示在這個類或對象上進行反射,類的值可以使Class,也可以是完整的類名(包含包名信息)

Reflect.create 用來調用之前的類的構造方法,有兩種重載,一種有參數,一種無參數

Reflect.call 方法調用,傳入方法名和參數,如有返回值還需要調用get

Reflect.get 獲取(field和method返回)值相關,會進行類型轉換,常與call和field組合使用

Reflect.field 獲取屬性值相關,需要調用get獲取該值

Reflect.set 設置屬性相關。

ReflectException

引入ReflectException避免了我們去catch過多的異常,也減少了縱向代碼量,使得代碼簡潔不少。ReflectException拋出,可能是發生了以下異常。

ClassNotFoundException

IllegalAccessException

IllegalArgumentException

InstantiationException

InvocationTargetException

NoSuchMethodException

NoSuchFieldException

SecurityException

除此之外,ReflectException屬于unchecked 異常,語法上不需要顯式進行捕獲,但是也需要根據實際情況,斟酌是否進行顯式捕獲該異常。

使用示例

創建實例

String string = Reflect.on(String.class).create("Hello World").get();

訪問屬性(public,protected,package,private均可)

1

char pathSeparatorChar = Reflect.on(File.class).create("/sdcard/droidyue.com").field("pathSeparatorChar").get();

修改屬性(final屬性也可以修改)

1

String setValue = Reflect.on(File.class).create("/sdcard/drodiyue.com").set("path", "fakepath").get("path");

調用方法(public,protected,package,private均可)

ArrayList arrayList = new ArrayList();

arrayList.add("Hello");

arrayList.add("World");

int value = Reflect.on(arrayList).call("hugeCapacity", 12).get();

實現原理

Reflect實際是對原生java reflect進行封裝,屏蔽了無關細節。

以fields方法為例,其內部實現可以看出是調用了java原生提供的反射相關的代碼。

public Map fields() {

 Map result = new LinkedHashMap();

 Class type = type();

 do {

 for (Field field : type.getDeclaredFields()) {

 if (!isClass ^ Modifier.isStatic(field.getModifiers())) {

 String name = field.getName();

 if (!result.containsKey(name))

 result.put(name, field(name));

 }

 }

 type = type.getSuperclass();

 } while (type != null);

 return result;

}

以上就是關于“Java反射庫怎么實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南阳市| 宜兰市| 偃师市| 招远市| 鹤山市| 金阳县| 罗源县| 南和县| 蒲城县| 潜山县| 巴林右旗| 宝兴县| 阿拉善右旗| 南昌市| 平利县| 渝中区| 深圳市| 雅江县| 洛南县| 边坝县| 天长市| 宜春市| 麻城市| 上杭县| 江都市| 长沙市| 洛宁县| 邻水| 东乡族自治县| 怀化市| 武冈市| 南昌县| 大连市| 萨迦县| 九江县| 鹿泉市| 雅江县| 长宁区| 麟游县| 齐齐哈尔市| 行唐县|