文章目录

  • 前言
  • 一、获取 Activity 中的所有方法
  • 二、获取方法上的注解
  • 三、获取注解上的注解
  • 四、通过注解属性获取相关事件信息

前言

Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;

在博客 【IOC 控制反转】Android 事件依赖注入 ( 事件三要素 | 修饰注解的注解 | 事件依赖注入步骤 ) 中 , 定义了 222 个注解 ,

  • 第一个是方法上的注解 , 用于修饰方法 ;
  • 第二个是修饰注解的注解 , 该注解用于配置注入的方法 ( 事件监听方法 | 监听器类型 | 监听器回调方法 ) ;

事件依赖注入比较复杂 , 涉及到动态代理 , 本博客分析 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 ) 事件依赖注入的详细步骤 ;

本博客的核心是 : 使用动态代理 , 创建 View.OnClickListenerView.OnLongClickListenerView.onTouchListener 等接口的动态代理类 ;
拦截相应的 onClick , onLongClick , onTouch 方法 , 执行自己的方法 , 其它方法正常执行 ;

一、获取 Activity 中的所有方法


通过反射获取 Activity 类 , 然后调用 Class 的 getDeclaredMethods 方法 , 获取 Activity 中的所有方法 ;

// 获取 Class 字节码对象
Class<? extends Activity> clazz = activity.getClass();
// 获取所有方法
Method[] methods = clazz.getDeclaredMethods();

二、获取方法上的注解


获取方法的所有注解 , 获取的是 @OnClick({R.id.textView}) // 事件注入 注解 ;

调用 Method 方法的 getDeclaredAnnotations 方法 , 获取方法上的注解数组 ;

        // 循环遍历类的方法for (int i = 0; i < methods.length; i ++) {// 获取方法的所有注解Annotation[] annotations = methods[i].getDeclaredAnnotations();}

三、获取注解上的注解


遍历上个步骤获取的注解数组 , 每个注解上可能有多个修饰注解的注解 , 如下注解是 OnClick 上的 333 个注解 ;

@Target(ElementType.METHOD)   // 该注解作用于方法上
@Retention(RetentionPolicy.RUNTIME)    // 注解保留到运行时
@EventBase(listenerSetter = "setOnClickListener",listenerType = View.OnClickListener.class,callbackMethod = "onClick")
public @interface OnClick {int[] value();    // 接收 int 类型数组
}

调用 annotationType 方法 , 获取注解的类型 , 只处理 @EventBase 注解 ;

            // 遍历所有的注解for (int j = 0; j < annotations.length; j ++) {// 获取注解类型Class<? extends Annotation> annotationType = annotations[j].annotationType();// 获取 @EventBase 注解EventBase eventBase = annotationType.getAnnotation(EventBase.class);if (eventBase == null) {// 如果没有获取到 EventBase 注解 , 执行下一次循环continue;}}

四、通过注解属性获取相关事件信息


最终目的是进行如下设置 :

                textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {}});

需要获取 textView 组件 , 可以在注解中获取 @OnClick({R.id.textView}) 组件 ID , 根据 ID 获取组件 ;

获取并执行 View 组件的 setOnClickListener 方法 , 通过反射获取该方法 ;

创建 View.OnClickListener 接口实现类 , 并实现 onClick 方法 , 这里特别注意 , 必须使用代理拦截该方法 , 替换成自己的方法 , 即在 MainActivity 中使用 @OnClick({R.id.textView}) 注解修饰的方法 ;

如果使用静态代理 , 则只能创建固定的 View.OnClickListener 接口的静态代理类 , 无法实现为组件设置长按事件 , 触摸事件 ;

因此这里使用动态代理实现 , 使用动态代理 , 创建 View.OnClickListenerView.OnLongClickListenerView.onTouchListener 等接口的动态代理类 ;

@EventBase 注解中配置事件的三要素 , 设置事件监听的方法 , 监听器类型 , 事件触发回调方法 ;

package kim.hsl.ioc_lib;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解*  用于注解上的注解*  用于依赖注入视图*/
@Target(ElementType.ANNOTATION_TYPE)   // 该注解作用于注解上
@Retention(RetentionPolicy.RUNTIME)    // 注解保留到运行时
public @interface EventBase {/*** 设置事件监听的方法* @return*/String listenerSetter();/*** 设置监听器类型* @return*/Class<?> listenerType();/*** 事件触发后的回调方法* @return*/String callbackMethod();
}

获取注解中的事件三要素 :

                // 点击事件 View.setOnClickListenerString listenerSetter = eventBase.listenerSetter();// 监听器类型 View.OnClickListenerClass<?> listenerType = eventBase.listenerType();// 事件触发回调方法 public void onClick(View v)String callbackMethod = eventBase.callbackMethod();

获取 要拦截的方法 以及 要注入的方法 ,
要拦截的方法是事件监听器的方法 , 要注入的方法是用户在 MainActivity 中使用 @OnClick 注解修饰的方法 ;

最后将这两个方法放在 Map 集合中 ;

                // 拦截 callbackMethod 方法 , 执行 method[i] 方法//      这个 method[i] 方法就是在 MainActivity 中用户自定义方法//      被 OnClick 注解修饰的方法//      将其封装到 Map 集合中Map<String, Method> methodMap = new HashMap<>();methodMap.put(callbackMethod, methods[i]);

【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )相关推荐

  1. Spring→简介核心作用范围、框架、接口编程、IOC控制反转、单元测试、Bean容器、注入、作用域、生命周期、自动装配注入、自动扫描@注解

    官网 https://spring.io/ 文档 https://spring.io/projects/spring-framework Spring框架 框架 接口 IOC控制反转 单元测试 Bea ...

  2. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )

    文章目录 前言 一.创建 事件监听器 对应的 动态代理 二.动态代理 数据准备 三.动态代理 调用处理程序 四.动态代理 实例对象创建 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

  3. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )

    文章目录 前言 一.获取要注入事件的 View 对象 二.通过反射获取 View 组件的事件设置方法并执行 前言 Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , ...

  4. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )

    文章目录 总结 一.Android 事件依赖注入示例 1.创建依赖注入库 2.声明注解 (1).修饰注解的注解 (2).修饰方法的注解 3.Activity 基类 4.动态代理类调用处理程序 5.依赖 ...

  5. 【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )

    文章目录 总结 一.Android 视图依赖注入步骤 二.Android 布局依赖注入示例 1.创建依赖注入库 2.声明注解 3.Activity 基类 4.依赖注入工具类 5.客户端 Activit ...

  6. 【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )

    文章目录 总结 一.Android 布局依赖注入步骤 二.Android 布局依赖注入示例 1.创建依赖注入库 2.声明注解 3.Activity 基类 4.依赖注入工具类 5.客户端 Activit ...

  7. IOC控制反转(依赖注入思想)

    IOC控制反转(依赖注入思想) 获取map 类型的 request session application 的方法: 实现RequestAware,SessionAware,ApplicationAw ...

  8. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入

    IoC 控制反转.DI 依赖注入 Spring 简介 Spring 基本使用 - IoC 容器 依赖注入 (Dependency Injection) 基于 setter 的注入 - 自定义对象 be ...

  9. 什么是IOC(控制反转)、DI(依赖注入)举个形象的例子通俗易懂

    更多免费教学文章请关注这里 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清 ...

最新文章

  1. WinAPI: GetForegroundWindow - 获取前台窗口的句柄
  2. QT学习:多国语言国际化
  3. NSIS打包软件(一)
  4. C++ STL 遍历 map 的时候如何删除其中的 element
  5. 安卓抓包软件_Packet Capture安卓抓包神器介绍及使用教程
  6. 全网最细之instanceof和类型转换
  7. Eclipse保护色设置
  8. 《objective-c程序设计》学习笔记
  9. openstack kolla 安装报错
  10. 脚本小子_python基础
  11. iOS开发 - 使用IJKPlayer时,关于需求要边下边播的缓存功能,退回来后播放缓存不再耗流量
  12. 微信小程序仿网易云音乐(使用云开发,提供源码)
  13. 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps
  14. linux中audit服务,linux下的audit服务
  15. python图片隐写_CTF 图像隐写Python脚本处理
  16. Linux过来人帮你理清学习思路
  17. 编译安装0bda 8179无线网卡
  18. 安卓开源项目(最近准备撸安卓)
  19. jsp标签jsp:useBean用法
  20. n.m8yun.com/list/sy.php?p=1,开胃菜:冰蝎2.0流量分析

热门文章

  1. Object_Type列表
  2. linux 命令之电子书chm格式下载
  3. 心得体悟帖---13、编程和学习同时进行
  4. HDFS2.X架构及工作原理
  5. EOS开发基础之五:使用cleos命令行客户端操作EOS——智能合约之Exchange
  6. 重拾简单的linux指令之info 【转】
  7. SBT搭建Spark
  8. Android wear
  9. Winform、WPF、Silverlight、MFC区别与联系
  10. 关于Java实现去除连续空格的延伸