文章目录
一、根据事件类型获取订阅者
二、调用订阅方法
一、根据事件类型获取订阅者
接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) ;
通过事件类型到 Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找相应的 订阅对象 + 订阅方法 ;
获取事件类型 :
// 获取事件类型 Class<?> eventType = event.getClass();
Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找事件类型对应的订阅者 ;
// 获取事件类型对应的 订阅者 集合 CopyOnWriteArrayList<MySubscription> subscriptions = subscriptionsByEventType.get(eventType);
遍历并调用订阅者 :
// 确保订阅者大于等于 1 个 if (subscriptions != null && subscriptions.size() > 0) { // 遍历订阅者并调用订阅方法 for (MySubscription subscription : subscriptions) { postSingleSubscription(subscription, event); } }
部分代码示例 :
/** * 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 * 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) * 通过事件类型到 * Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType * 集合中查找相应的 订阅对象 + 订阅方法 * @param event */ public void post(Object event) { // 获取事件类型 Class<?> eventType = event.getClass(); // 获取事件类型对应的 订阅者 集合 CopyOnWriteArrayList<MySubscription> subscriptions = subscriptionsByEventType.get(eventType); // 确保订阅者大于等于 1 个 if (subscriptions != null && subscriptions.size() > 0) { // 遍历订阅者并调用订阅方法 for (MySubscription subscription : subscriptions) { postSingleSubscription(subscription, event); } } }
二、调用订阅方法
通过反射调用订阅方法 ;
在 MySubscription 中封装了 订阅者对象 和 订阅方法 , 订阅方法中封装了 Method 方法 ;
直接调用 Method 对象的 invoke 方法 , 通过反射调用订阅方法 , 传入的第一个参数是 订阅者对象 , 即订阅方法所在的对象 , 传入的第二个参数是 订阅方法接收的事件参数对象 ;
/** * 调用订阅者的订阅方法 * @param subscription 订阅者对象 + 订阅方法 * @param event 发布者传递的消息事件 */ private void invokeMethod(MySubscription subscription, Object event) { try { // 通过反射调用订阅方法 subscription.getSubscriberMethod().getMethod().invoke( subscription.getSubscriber(), // 订阅者对象 event // 事件参数类型 ); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }