EventBusSubscriber 注解

基本信息

属性 值
所属 Forgelin(modid forgelin)
类型 注解(annotation class)
源码 EventBusSubscriber.kt:30-37
保留策略 AnnotationRetention.RUNTIME
目标 AnnotationTarget.TYPE(仅类)

作用

本注解是 Forge 1.12.2 版 net.minecraftforge.fml.common.Mod.EventBusSubscriber 在 1.7.10 上的 Kotlin 复刻版。1.7.10 的 Forge 尚未提供该注解, Forgelin 把它原样搬过来,使 Kotlin mod 也能在类级别一次性订阅事件, 而不必逐个方法写 @SubscribeEvent。

源码文件头部注释明确写明来源(EventBusSubscriber.kt:22-24): 取自 MinecraftForge 1.12.x 分支的 net.minecraftforge.fml.common.Mod。

参数

参数 类型 默认值 含义
value vararg Side [Side.CLIENT, Side.SERVER] 目标侧;Side 取自 cpw.mods.fml.relauncher.Side
modid String "" 仅当注解不在带 @Mod 的同一个类上时需要填写,用于避免提前类加载

实际注册过程

  1. 启用条件是 mod 的 @Mod(modLanguageAdapter = ...) 恰好为 net.shadowfacts.forgelin.KotlinAdapter(ForgelinAutomaticEventSubscriber.kt:39-42), 否则直接跳过并打 debug 日志。
  2. FML 自身也会扫描该注解,因此 Kotlin object 会被错误地按静态方式注册。 Forgelin 在 PreInit 阶段主动撤销并重注册(见 自动事件订阅器)。
  3. 解析 value 时通过反射读取 ModAnnotation.EnumHolder.value 字段 (ForgelinAutomaticEventSubscriber.kt:110-111)以拿到侧名字符串; 解析不出时回退到全部侧。

限制

  • value 的默认声明是 vararg val value: Side = [Side.CLIENT, Side.SERVER], 由于是 vararg,Kotlin 侧必须用 EventBusSubscriber(Side.CLIENT) 形式传值。
  • 注解 @Target 只有 TYPE,不能标在方法上;类内方法仍需各自标 @SubscribeEvent。

相关条目