|
1 | 1 | ```java |
2 | | - private void hookOnClickListener(View view) { |
| 2 | +/** |
| 3 | + * 实现点击监听 |
| 4 | + */ |
| 5 | +public class OnClickListenerProxy implements View.OnClickListener{ |
| 6 | + private View.OnClickListener mOriginalListener; |
| 7 | + |
| 8 | + //直接在构造函数中传进来原来的OnClickListener |
| 9 | + public OnClickListenerProxy(View.OnClickListener originalListener) { |
| 10 | + mOriginalListener = originalListener; |
| 11 | + } |
| 12 | + |
| 13 | + @Override public void onClick(View v) { |
| 14 | + if (mOriginalListener != null) { |
| 15 | + mOriginalListener.onClick(v); |
| 16 | + } |
| 17 | + Log.d("LOGCAT","hooked!"); |
| 18 | + } |
| 19 | +} |
| 20 | + |
| 21 | +public static void hookOnClickListener(View view) { |
3 | 22 | try { |
4 | 23 | // 得到 View 的 ListenerInfo 对象 |
5 | 24 | Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo"); |
| 25 | + //修改getListenerInfo为可访问(View中的getListenerInfo不是public) |
6 | 26 | getListenerInfo.setAccessible(true); |
7 | 27 | Object listenerInfo = getListenerInfo.invoke(view); |
8 | 28 | // 得到 原始的 OnClickListener 对象 |
|
11 | 31 | mOnClickListener.setAccessible(true); |
12 | 32 | View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo); |
13 | 33 | // 用自定义的 OnClickListener 替换原始的 OnClickListener |
14 | | - View.OnClickListener hookedOnClickListener = new HookedOnClickListener(originOnClickListener); |
| 34 | + View.OnClickListener hookedOnClickListener = new OnClickListenerProxy(originOnClickListener); |
15 | 35 | mOnClickListener.set(listenerInfo, hookedOnClickListener); |
16 | 36 | } catch (Exception e) { |
17 | | - Log.e("hook clickListener failed!", e.getMessage()); |
| 37 | + Log.d("LOGCAT","hook clickListener failed!", e); |
18 | 38 | } |
19 | 39 | } |
20 | 40 |
|
| 41 | + |
21 | 42 | public void hookH_Handler() { |
22 | 43 | try { |
23 | 44 | //拿到 ActivityThread#H |
|
0 commit comments