1. 程式人生 > >Android使用 Java 反射實現 API Hook

Android使用 Java 反射實現 API Hook

文章內容來自https://www.jianshu.com/p/4f6d20076922

部落格主要起到學習和記錄的作用

直接貼程式碼了

   private void hookOnClickListener(View view) {
        try {
            // 得到 View 的 ListenerInfo 物件
            //得到getListenerInfo方法
            Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
            getListenerInfo.setAccessible(true);
            //得到ListenerInfo變數
            Object listenerInfo = getListenerInfo.invoke(view);
            // 得到 原始的 OnClickListener 物件
            //獲取指定類
            Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");
            //獲取類中的變數
            Field mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener");
            mOnClickListener.setAccessible(true);
            View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);
            // 用自定義的 OnClickListener 替換原始的 OnClickListener
            View.OnClickListener hookedOnClickListener = new HookedOnClickListener(originOnClickListener);
            mOnClickListener.set(listenerInfo, hookedOnClickListener);
        } catch (Exception e) {
            KLog.w("hook clickListener failed!", e);
        }
    }


    class HookedOnClickListener implements View.OnClickListener {
        private View.OnClickListener origin;

        HookedOnClickListener(View.OnClickListener origin) {
            this.origin = origin;
        }

        @Override
        public void onClick(View v) {
            Toast.makeText(FeedbackActivity.this, "hook click", Toast.LENGTH_SHORT).show();
            KLog.i("Before click, do what you want to to.");
            if (origin != null) {
                origin.onClick(v);
            }
            KLog.i("After click, do what you want to to.");
        }
    }
使用
 mTvQQ.setOnClickListener(this);
        hookOnClickListener(mTvQQ);



相關推薦

Android使用 Java 反射實現 API Hook

文章內容來自https://www.jianshu.com/p/4f6d20076922 部落格主要起到學習和記錄的作用 直接貼程式碼了 private void hookOnClickListener(View view) { try {

android java實現hook替換method

reflect 過程 ren pic [] hotfix mru andro bsp   Android上的熱修復框架 AndFix 大家都很熟悉了,它的原理實際上很簡單:   方法替換——Java層的每一個方法在虛擬機實現裏面都對應著一個ArtMethod的結構體,只要把

反射+代理實現 API Hook(以 ActivityManager 為例)

最近看Android招聘資訊,發現一個自己不太會的點 hook 機制,查了一下資料,現在整理一下。特別感謝acxingyun同學提供了詳細的姿勢。點選地址 什麼是 Hook hook 翻譯過來是鉤子的意思。 目的就是在事件傳送到終點前截獲並監控事件的傳輸

java反射實現前端接收實體對象,去除“null”字符串

學習工具總結從前臺輸入的的json 格式數據。轉換成對應的實體類後。 可能會出現把null 轉換成“null”字符串。這樣的數據在存入數據庫是可能會因為數據格式,存入時會有問題。實體字段多,修改有很麻煩。所以需要統一編輯處理下。 實體類package com.tansun.ider.model.vo; pub

Java反射常用API匯總

所有 void 通過 IE get eth AD const tor “JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性” 一、類對象的獲取 1.通過對象獲取 Object obj = n

java反射實現例子

 /**  * getCntrFromEdi   * @param ediFileBean  * @param iMainkey  * @param cntrno  * @return  */ public Object getCntrFromEdi(EdiFileBean

java反射實現物件轉JSON(貼上可用)

 package test; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.Iterator; import

通過java反射實現的excel資料匯出

Excel.java @SuppressWarnings("deprecation") public static &lt;T&gt; void ExportExcel(String title, String[] headers,Collection&lt;T

利用java反射實現兩個具有相同屬性bean賦值

import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassReflection { /** * @param class1 用於賦值的實體類

java JavaBean(實體類)轉化為map (利用Java反射實現

/** * 獲取利用反射獲取類裡面的值和名稱轉化為map * * @param obj //JavaBean * @return map * @throws IllegalAccessException

通過自定義註解和java反射實現Spring-DI依賴注入

依賴注入的原理就是簡單說就是從頭往下遞迴生成依賴物件的,然後對引用欄位賦值最後返回。 這裡實現通過變數型別來生成相應的物件。 模擬一個使用者的註冊業務,首先是controller層呼叫service層,然後呼叫dao層程式碼實現儲存使用者。 檔案結構: UserC

Java反射實現介面

轉自: http://blog.csdn.net/lastwarmth/article/details/49466899 之前做過一個外掛,綜合了移動MM,移動和遊戲,沃商店等一些計費SDK。將這些計費SDK提供的介面全部整合,最後由外掛提供一套介面。通過後臺配置,來讓遊戲使用某種計費SDK。遊戲開發商

java反射實現動態代理模式

代理模式的作用是:為其他物件提供一種可以控制的訪問方式, 代理的角色: 1.抽象角色  宣告真實物件和代理物件需要實現的介面; 2.代理角色  代理物件內部含有對真實物件的引用,從而可以操縱真實的物件,同時代理物件 提供與真實物件相同的介面,以便在任何時刻都能替代真實物件,

Android java方法實現呼叫系統屬性

     最近在寫一個測試apk時需要呼叫Android的系統屬性來設定相關的標誌位,但在使用標準的java庫中的System.getProperty和System.setProperty方法並不能獲得Android中的系統屬性,而且會出現空指標崩潰。查閱相關資料發現,雖

Java反射實現JSON與JavaBean之間的轉換

        專案中需要將Websocket伺服器傳來的JSON字串解析並存入資料庫,該JSON字串是與系統中的實體一一對應的,如果要單獨解析會十分麻煩,而且一大段程式碼很不美觀,於是寫了一個小工具

JAVA反射實現JdbcTemplate中查詢方法 返回的結果集自動封裝成對應的JAVABean對象

block ada declare object execute pla conn list() 語句 將JdbcTemplate中查詢方法返回的結果集自動封裝成對應的JAVABean對象 只能查詢單張表的數據 封裝到對應的JAVABean對象中 查詢的列數隨意 可以不

Android Java Web實現登入註冊(二)——伺服器端

Eclipse新建Dynamic Web Project,新建index.html,執行看見沒有提示404錯誤的頁面即Tomcat伺服器部署成功。這是搭建Java Web環境時需要完成的工作。詳細內容請看點選開啟連結 涉及的檔案與專案結構:    一、Servlet類

Android:利用Java反射呼叫@hide的API

設定使用3G資料功能: 從原始碼看到隱藏的API(ConnectivityManager.java): /** * Sets the persisted value for enabling/disabling Mobile data. *

利用JAVA反射機制實現調用私有方法

parse try ble cat 權限 利用 enabled tde mod 1.fragment是AccessibilityFragment的對象。須要被調用的方法的類。 setAccessible(true)並非將方法的訪問權限改成了public。而是取

API Hook基本原理和實現

use 概率 缺省 後綴 origin gif object cati mov API Hook基本原理和實現 2009-03-14 20:09 windows系統下的編程,消息message的傳遞是貫穿其始終的。這個消息我們可以簡單理解為一個有特定