Java轻量级EventBus核心是用ConcurrentHashMap存储事件类型到@Subscribe方法列表的映射,通过反射调用监听方法(约定单参数事件对象),支持同步调用(POSTING),配合自定义注解实现,无需第三方依赖。

Java中用反射实现轻量级 EventBus,核心是:用 Map 存储事件类型到监听器列表的映射,用 反射调用监听方法(支持参数自动匹配),并配合简单的注解和线程安全控制。不依赖第三方库,几十行代码即可跑起来。
定义事件监听注解 @Subscribe
用于标记哪个方法是事件处理器,可选指定线程模式(如 POSTING、MAIN、BACKGROUND)——轻量版可先只支持同步调用(POSTING):
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
}
public enum ThreadMode {
POSTING // 直接在发布线程调用
}
注册监听器:扫描所有 @Subscribe 方法并缓存
遍历目标对象的所有 public 方法,检查是否有 @Subscribe 注解;提取方法参数类型(即它能处理的事件类型),以 Class<?> → List<Method> 形式存入 ConcurrentHashMap:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
method.getParameterTypes()[0]获取唯一事件参数类型(约定监听方法只接受一个参数,即事件对象) - 用
ConcurrentHashMap<class>, CopyOnWriteArrayList<subscription>></subscription></class>存储,避免并发修改问题 -
Subscription封装了 target 对象、method、threadMode,便于后续调用和解注册
发布事件:反射调用所有匹配监听器
根据事件实例的 getClass() 查找对应监听器列表,遍历执行:
立即学习“Java免费学习笔记(深入)”;
- 对每个
Subscription,用method.invoke(subscription.target, event)反射调用 - 加 try-catch 捕获
IllegalAccessException/InvocationTargetException,避免一个监听器异常中断整个分发 - 轻量版暂不处理线程切换(如 Android 主线程),如需可结合 Handler 或 CompletableFuture 延迟派发
解注册:移除 target 关联的所有 Subscription
遍历所有事件类型对应的列表,逐个比对 subscription.target == target,移除匹配项。为提升效率,也可额外维护 Map<object set>></object> 记录对象到订阅的映射。

















