# 监听函数拦截 > 核心`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`实例,所以自由度还是挺高的,例如针对各种自定义注解进行解析。