日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

發(fā)布時間:2025/6/17 Android 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android 插件化系列文章目錄

【Android 插件化】插件化簡介 ( 組件化與插件化 )
【Android 插件化】插件化原理 ( JVM 內(nèi)存數(shù)據(jù) | 類加載流程 )
【Android 插件化】插件化原理 ( 類加載器 )

【Android 插件化】“ 插樁式 “ 插件化框架 ( 原理與實(shí)現(xiàn)思路 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 類加載器創(chuàng)建 | 資源加載 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 獲取插件入口 Activity 組件 | 加載插件 Resources 資源 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 運(yùn)行應(yīng)用 | 代碼整理 )

【Android 插件化】Hook 插件化框架 ( Hook 技術(shù) | 代理模式 | 靜態(tài)代理 | 動態(tài)代理 )
【Android 插件化】Hook 插件化框架 ( Hook 實(shí)現(xiàn)思路 | Hook 按鈕點(diǎn)擊事件 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動過程 | 靜態(tài)代理 )

【Android 插件化】Hook 插件化框架 ( 從 Hook 應(yīng)用角度分析 Activity 啟動流程 一 | Activity 進(jìn)程相關(guān)源碼 )
【Android 插件化】Hook 插件化框架 ( 從 Hook 應(yīng)用角度分析 Activity 啟動流程 二 | AMS 進(jìn)程相關(guān)源碼 | 主進(jìn)程相關(guān)源碼 )

【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )
【Android 插件化】Hook 插件化框架 ( 通過反射獲取 “插件包“ 中的 Element[] dexElements )
【Android 插件化】Hook 插件化框架 ( 通過反射獲取 “宿主“ 應(yīng)用中的 Element[] dexElements )
【Android 插件化】Hook 插件化框架 ( 合并 “插件包“ 與 “宿主“ 中的 Element[] dexElements | 設(shè)置合并后的 Element[] 數(shù)組 )
【Android 插件化】Hook 插件化框架 ( 創(chuàng)建插件應(yīng)用 | 拷貝插件 APK | 初始化插件包 | 測試插件 DEX 字節(jié)碼 )

【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動流程 | Hook 點(diǎn)分析 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動流程 | 反射獲取 IActivityManager 對象 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動流程 | AMS 啟動前使用動態(tài)代理替換掉插件 Activity 類 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動流程 | 主線程創(chuàng)建 Activity 實(shí)例之前使用插件 Activity 類替換占位的組件 )

【Android 插件化】Hook 插件化框架 ( 反射工具類 | 反射常用操作整理 )


文章目錄

  • Android 插件化系列文章目錄
  • 前言
  • 一、成員變量
  • 二、反射工具類入口方法
  • 三、反射 Field 相關(guān)方法
    • 1、反射 Field 字段
    • 2、反射獲取 Field 對應(yīng)實(shí)例
    • 3、反射設(shè)置 Field 對應(yīng)實(shí)例
  • 四、反射 Method 相關(guān)方法
    • 1、反射 Method 方法
    • 2、反射調(diào)用 Method 方法
  • 五、完整反射工具類代碼示例
  • 六、博客資源

前言

在前面的幾篇博客中 , 大量使用到了反射操作 , 使用反射時 , 需要處理大量的異常信息 , 很麻煩 ;

在本篇博客中 , 封裝一個反射工具類 , 用于反射的常用操作 , 如 反射類 , 字段 , 方法 , 實(shí)例化對象 , 獲取 / 設(shè)置 字段 , 執(zhí)行方法 等操作 ;





一、成員變量



將反射涉及到的 類 , 實(shí)例對象 , 字段 , 方法 , 設(shè)置為反射工具類的成員變量 ;

/*** 反射的類型*/private Class<?> mClass;/*** 反射針對的實(shí)例對象* 如獲取 Object 某個字段的值*/private Object mCaller;/*** 反射的字段*/private Field mField;/*** 反射的方法*/private Method mMethod;



二、反射工具類入口方法



入口方法主要是設(shè)置 反射類 / 對象 ;

/*** 反射某個類的入口方法** @param type 要反射的類* @return*/public static Reflector on(Class<?> type) {Reflector reflector = new Reflector();reflector.mClass = type;return reflector;}/*** 反射某個類的入口方法** @param className 要反射的類名* @return*/public static Reflector on(String className) {try {return on(Class.forName(className));} catch (ClassNotFoundException e) {e.printStackTrace();return null;}}/*** 反射某個類的入口方法** @param object 反射類對應(yīng)的實(shí)例對象* @return*/public static Reflector on(Object object) {return on(object.getClass()).with(object);}/*** 設(shè)置反射對應(yīng)的實(shí)例對象** @param object* @return*/public Reflector with(Object object) {mCaller = object;return this;}



三、反射 Field 相關(guān)方法




1、反射 Field 字段


反射某字段 :

/*** 反射類中的某個字段** @param name 要反射的字段名稱* @return*/public Reflector field(String name) {mField = findField(name);mField.setAccessible(true);return this;}/*** 查找字段名稱* 首先在本類中查找* 如果找到直接返回字段* 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該字段* 如果有父類 , 則在父類中查找* 如果在父類中找到 , 返回該字段* 如果在父類中沒有找到 , 則返回空* 如果沒有父類 , 返回空** 盡量傳具體的正確的類 , 不要傳子類* @param fieldName* @return*/private Field findField(String fieldName) {try {// 首先在本類中查找 , 如果找到直接返回字段return mClass.getDeclaredField(fieldName);} catch (NoSuchFieldException e) {// 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該字段for (Class<?> clazz = mClass; clazz != null; clazz = clazz.getSuperclass()) {try {// 如果在父類中找到 , 返回該字段return clazz.getDeclaredField(fieldName);} catch (NoSuchFieldException ex) {// 如果在父類中沒有找到 , 則返回空return null;}}// 如果沒有父類, 則返回空return null;}}

2、反射獲取 Field 對應(yīng)實(shí)例


/*** 獲取 mCaller 對象中的 mField 屬性值** @return*/public Object get() {try {return mField.get(mCaller);} catch (IllegalAccessException e) {e.printStackTrace();return null;}}

3、反射設(shè)置 Field 對應(yīng)實(shí)例


/*** 設(shè)置 mCaller 對象中的 mField 屬性值** @param value* @return 鏈?zhǔn)秸{(diào)用 , 返回 Reflector*/public Reflector set(Object value) {try {mField.set(mCaller, value);} catch (IllegalAccessException e) {e.printStackTrace();}return this;}



四、反射 Method 相關(guān)方法




1、反射 Method 方法


/*** 反射類中的某個方法** @param name* @param args* @return*/public Reflector method(String name, Class<?>... args) {mMethod = findMethod(name, args);mMethod.setAccessible(true);return this;}/*** 根據(jù)方法名 和 參數(shù)名稱 , 查找 Method 方法* 首先在本類中查找* 如果找到直接返回字段* 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該字段* 如果有父類 , 則在父類中查找* 如果在父類中找到 , 返回該字段* 如果在父類中沒有找到 , 則返回空* 如果沒有父類 , 返回空** 盡量傳具體的正確的類 , 不要傳子類* @param name* @param args* @return*/private Method findMethod(String name, Class<?>... args) {try {// 首先在本類中查找 , 如果找到直接返回方法return mClass.getDeclaredMethod(name, args);} catch (NoSuchMethodException e) {// 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該方法for (Class<?> cls = mClass; cls != null; cls = cls.getSuperclass()) {try {// 如果在父類中找到 , 返回該字段return cls.getDeclaredMethod(name);} catch (NoSuchMethodException ex) {// 如果在父類中沒有找到 , 則返回空return null;}}// 如果沒有父類, 則返回空return null;}}

2、反射調(diào)用 Method 方法


/*** 調(diào)用 mCaller 的 mMethod 方法** @param args* @param <T>* @return*/public <T> T call(Object... args) {try {return (T) mMethod.invoke(mCaller, args);} catch (IllegalAccessException e) {e.printStackTrace();return null;} catch (InvocationTargetException e) {e.printStackTrace();return null;}}



五、完整反射工具類代碼示例



package kim.hsl.plugin;import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** 封裝反射相關(guān)邏輯的工具類* 該封裝類會維持鏈?zhǔn)秸{(diào)用*/ public class Reflector {/*** 反射的類型*/private Class<?> mClass;/*** 反射針對的實(shí)例對象* 如獲取 Object 某個字段的值*/private Object mCaller;/*** 反射的字段*/private Field mField;/*** 反射的方法*/private Method mMethod;/*** 反射某個類的入口方法** @param type 要反射的類* @return*/public static Reflector on(Class<?> type) {Reflector reflector = new Reflector();reflector.mClass = type;return reflector;}/*** 反射某個類的入口方法** @param className 要反射的類名* @return*/public static Reflector on(String className) {try {return on(Class.forName(className));} catch (ClassNotFoundException e) {e.printStackTrace();return null;}}/*** 反射某個類的入口方法** @param object 反射類對應(yīng)的實(shí)例對象* @return*/public static Reflector on(Object object) {return on(object.getClass()).with(object);}/*** 設(shè)置反射對應(yīng)的實(shí)例對象** @param object* @return*/public Reflector with(Object object) {mCaller = object;return this;}/*** 創(chuàng)建 mClass 類型的實(shí)例對象* @param <T>* @return* @throws Exception*/public <T> T newInstance() {try {return (T) mClass.newInstance();} catch (IllegalAccessException e) {e.printStackTrace();return null;} catch (InstantiationException e) {e.printStackTrace();return null;}}/*** 反射類中的某個字段** @param name 要反射的字段名稱* @return*/public Reflector field(String name) {mField = findField(name);mField.setAccessible(true);return this;}/*** 查找字段名稱* 首先在本類中查找* 如果找到直接返回字段* 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該字段* 如果有父類 , 則在父類中查找* 如果在父類中找到 , 返回該字段* 如果在父類中沒有找到 , 則返回空* 如果沒有父類 , 返回空** 盡量傳具體的正確的類 , 不要傳子類* @param fieldName* @return*/private Field findField(String fieldName) {try {// 首先在本類中查找 , 如果找到直接返回字段return mClass.getDeclaredField(fieldName);} catch (NoSuchFieldException e) {// 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該字段for (Class<?> clazz = mClass; clazz != null; clazz = clazz.getSuperclass()) {try {// 如果在父類中找到 , 返回該字段return clazz.getDeclaredField(fieldName);} catch (NoSuchFieldException ex) {// 如果在父類中沒有找到 , 則返回空return null;}}// 如果沒有父類, 則返回空return null;}}/*** 獲取 mCaller 對象中的 mField 屬性值** @return*/public Object get() {try {return mField.get(mCaller);} catch (IllegalAccessException e) {e.printStackTrace();return null;}}/*** 設(shè)置 mCaller 對象中的 mField 屬性值** @param value* @return 鏈?zhǔn)秸{(diào)用 , 返回 Reflector*/public Reflector set(Object value) {try {mField.set(mCaller, value);} catch (IllegalAccessException e) {e.printStackTrace();}return this;}/*** 反射類中的某個方法** @param name* @param args* @return*/public Reflector method(String name, Class<?>... args) {mMethod = findMethod(name, args);mMethod.setAccessible(true);return this;}/*** 根據(jù)方法名 和 參數(shù)名稱 , 查找 Method 方法* 首先在本類中查找* 如果找到直接返回字段* 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該字段* 如果有父類 , 則在父類中查找* 如果在父類中找到 , 返回該字段* 如果在父類中沒有找到 , 則返回空* 如果沒有父類 , 返回空** 盡量傳具體的正確的類 , 不要傳子類* @param name* @param args* @return*/private Method findMethod(String name, Class<?>... args) {try {// 首先在本類中查找 , 如果找到直接返回方法return mClass.getDeclaredMethod(name, args);} catch (NoSuchMethodException e) {// 如果在本類中沒有找到 , 就去遍歷它的父類 , 嘗試在父類中查找該方法for (Class<?> cls = mClass; cls != null; cls = cls.getSuperclass()) {try {// 如果在父類中找到 , 返回該字段return cls.getDeclaredMethod(name);} catch (NoSuchMethodException ex) {// 如果在父類中沒有找到 , 則返回空return null;}}// 如果沒有父類, 則返回空return null;}}/*** 調(diào)用 mCaller 的 mMethod 方法** @param args* @param <T>* @return*/public <T> T call(Object... args) {try {return (T) mMethod.invoke(mCaller, args);} catch (IllegalAccessException e) {e.printStackTrace();return null;} catch (InvocationTargetException e) {e.printStackTrace();return null;}} }



六、博客資源



博客資源 :

  • GitHub : https://github.com/han1202012/Plugin_Hook

總結(jié)

以上是生活随笔為你收集整理的【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。