多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 消息拦截 > 核心版本`1.5.0`增加。 > 注:核心`1.5.0` 之后最近的一次更新中(`1.6.0`)修改了拦截器相关类的包路径,会造成`1.5.0`版本与`1.6.0及其后续版本`不兼容,还请注意。 消息拦截发生在接收并获取到了有效的 **MsgGet** 对象,且尚未进行监听函数分配、执行的阶段。 此时,你可以对这个消息对象进行拦截,并进行一系列操作。 ## **使用** 首先,写一个类,使其实现`MsgIntercept`接口,并且标注`@Beans`注解。 > ※ 注意 此实现类在使用的时候,无论@Beans是否标记为单例,均只会实例化**一次**。 ```java /** * 示例 **/ @Beans public class TestIntercept implements MsgIntercept { /** * 可以使用部分依赖注入功能。 */ @Depend private TestBean bean; /** * 唯一必须实现的方法。 * @param context 上下文对象 * @return */ @Override public boolean intercept(MsgGetContext context) { if(context.getMsgGet() instanceof GroupMsg){ System.out.println("是群消息!"); } // 上下文对象可以set、get上下文值 context.set("name", "context!"); System.out.println("拦截: " + context.getMsgGet()); TestGroupMsg testGroupMsg = new TestGroupMsg(); testGroupMsg.setMsg("nmsl"); // 用一个新的GroupMsg对象来覆盖原本的GroupMsg对象 context.setMsgGet(testGroupMsg); // 放行 return true; } /** * 排序值,没有特殊需求不需要实现此方法。 */ @Override public int sort(){ return 0; } } ``` 此接口唯一一个抽象方法: ```java /** * 拦截执行函数 * @param context 上下文对象 * @return 是否放行 */ boolean intercept(MsgGetContext context); ``` 其中, 参数`MsgGetContext`提供了部分API以共使用: | API | 类型 | 描述 | | --- | --- | --- | --- | | `SENDER` | 公共常量 | 消息发送器,使用方法同MsgSender.SENDER | | `SETTER` | 公共常量 | 消息设置器,使用方法同MsgSender.SETTER | | `GETTER` | 公共常量 | 信息获取器,使用方法同MsgSender.GETTER | | `getMsgGet()` | 方法 | 获取此次监听到的MsgGet消息对象 | | `setMsgGet(MsgGet)` | 方法 | 覆盖当前监听到的MsgGet消息对象 | | `getTypes()` | 方法 | 获取当前监听到的消息类型 | | `setTypes(MsgGetTypes)` | 方法 | 设置当前监听到的消息类型,但是只会影响上下文对象的值,不会对监听发生影响 |