# 监听函数拦截
> 核心`1.13.0`增加
`监听函数`拦截器与`监听消息`拦截器不同,前者是在每一个监听函数前执行,而后者是在接收消息并触发监听之前执行。
`监听函数`拦截器与`自定义过滤`也略有不同,前者是在每一个监听函数前执行,是全局性的,不必手动指定,而后者则是针对性的,需要明确标记。
如果列一个大致的流程,那么大概就是:
```[flow]
st=>start: 监听到消息
e=>end: 监听结束
op1=>operation: 监听消息拦截
lp1_1=>operation: 监听函数1默认过滤器过滤
lp1_2=>operation: 监听函数1自定义过滤器过滤
lp1_3=>operation: 监听函数1监听函数拦截
lp2_1=>operation: 监听函数2默认过滤器过滤
lp2_2=>operation: 监听函数2自定义过滤器过滤
lp2_3=>operation: 监听函数2监听函数拦截
lp_other=>operation: ...
st->op1->lp1_1->lp1_2->lp1_3->lp2_1->lp2_2->lp2_3->lp_other->e
```
## **使用**
在可扫描范围内编写一个类,标记`@Beans`注解并实现`com.forte.qqrobot.listener.ListenIntercept`即`ListenIntercept`接口。
例如:
```java
@Beans
public class TestListenIntercept implements ListenIntercept {
@Override
public boolean intercept(ListenInterceptContext context) {
// 获取ListenerMethod对象
ListenerMethod value = context.getValue();
// ListenerMethod中包含大量获取资源的方法,这些资源大多数是用于内部逻辑的。
// 对于用户来说,比较可能会需要的参数就是method实例了,
// 你可以通过获取Method实例来实现对任何自定义注解的逻辑处理。
value.getMethod(); // 获取Method实例
value.getListener(); // 获取当前监听函数所在类的实例。
// 获取方法的执行参数
Object[] args = context.getArgs();
System.out.println(Arrays.toString(args));
// 获取ListenContext
context.getListenContext();
// 如果不放行,可通过此方法来设置拦截后监听函数的返回值
// context.setResult("result");
// 放行
return true;
}
}
```
可以看到,此拦截器的方法参数是一个`ListenInterceptContext`实例。你可以通过此实例获取到~~我原本并不想开放给用户的~~各项参数,并借此来实现各种逻辑。由于此实例能够直接获取到监听函数的`Method`实例,所以自由度还是挺高的,例如针对各种自定义注解进行解析。
- 前言
- 简单介绍
- 我该如何阅读文档
- 视频教程
- 安装与使用
- 开源协议
- 免责&捐助
- 注意事项
- 版本命名规则简介
- 主要功能版本历史
- 功能指引
- 通用API与功能
- 国际化语言
- 异常
- 消息监听
- @Listen
- @OnListen模板
- @Filter
- 消息参数截取
- @Spare
- @Constr
- @Ignore
- @ListenBreak
- @ListenBreakPlugin
- @ListenBody
- 监听响应
- 成功判定与返回值
- 监听上下文
- 动态参数
- 监听消息API
- 异步监听 @Async
- 限流监听 @Limit
- 自定义Http送信器
- 枚举与类型
- 送信器
- SENDER
- SETTER
- GETTER
- 返回值
- 其他位置
- 日志与日志拦截
- 异常处理
- 依赖注入
- 自定义依赖获取
- 批量依赖载入
- 注意事项
- 常量
- 定时任务
- 自定义过滤
- 拦截器
- 拦截器总定义
- 上下文对象总定义
- 监听消息拦截
- 送信器拦截
- 监听函数拦截
- CAT码
- CQ码
- CQCode
- CQ码工具类
- CQ扩展工具类
- AppendList拼接链
- 高级内容
- 阻断机制
- 截断机制
- 自定义枚举类型
- 枚举工厂
- byName注解
- 自定义注解
- 配置
- 文件配置
- 注解配置
- 参数配置
- 多配置
- 多账号
- 自定义账号管理器
- 小心!
- 核心版本与组件如何升级核心
- 核心版本迭代指南
- 核心
- 更新日志
- jar包与依赖
- 监听消息类结构图
- 快速启动
- 模组与扩展
- 模组开发
- 现有模组
- 通用模组-延时任务
- 通用模组-CQ码工具
- 转义器
- CQ码操作工具类
- CQ码模板-CodeTemplate
- CQ码载体-KQCode
- CQ码构建器
- MQ码工具类
- 通用模组-redis-bot管理器
- 通用模组-Debugger
- Debugger-common模块
- Debugger-server模块
- Debugger-client模块
- 通用模组-钉钉机器人
- 组件-Mirai(JVM)
- 快速开始(1.13+)
- springboot-starter
- 注意事项
- 配置
- 额外的内容
- 快速回复
- 额外监听
- CQ码解析
- 组件-酷Q(QQ)-CQ HTTP API(基本失效)
- 快速开始(推荐)
- 快速开始(1.7.x以下,不推荐)
- 快速开始(Springboot启动器)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 额外的内容
- 自定义额外监听
- CQ送信器
- 元事件
- 监听消息类结构图
- 组件-酷Q(QQ)-JCQ(失效)
- 快速开始
- 更新日志
- 额外的内容
- JCQ日志
- 配置
- 注意事项
- 监听消息类结构图
- 组件-酷Q(QQ)-HTTP TO CQ(失效)
- 快速开始(核心1.7.x及以下)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 监听消息类结构图
- 组件-酷Q(QQ)-LEMOC (失效)
- 快速开始(核心1.7.x及以下)
- 配置
- 注意事项
- 更新日志
- 监听消息类结构图
- Springboot快速启动器
- 常见问题汇总
- BUG反馈
- 更新计划总览