KotlinAdapter

基本信息

属性 值
所属 Forgelin(modid forgelin)
类型 ILanguageAdapter 实现(Kotlin → FML 语言适配器)
源码 KotlinAdapter.kt:16
面向 写 Kotlin 的 mod 作者

作用

KotlinAdapter 让 FML 能够用 Kotlin 的 object 声明来承载 @Mod 类。 在 @Mod 注解上填写 modLanguageAdapter = "net.shadowfacts.forgelin.KotlinAdapter" 之后,FML 就不再用反射 newInstance() 去构造 mod 主类,而是交给本适配器。

三个接口方法的实际实现:

接口方法 实现 行号
supportsStatics() return false —— 明确告知 FML 本 mod 不使用静态字段 KotlinAdapter.kt:20-22
getNewInstance(...) 优先取 objectClass.kotlin.objectInstance;为 null(普通 class)才回退 objectClass.newInstance() KotlinAdapter.kt:32-35
setProxy(target, proxyTarget, proxy) 把代理对象写进 proxyTarget.kotlin.objectInstance KotlinAdapter.kt:24-30
setInternalProxies(...) 空实现,注释写明 FML 自身已处理 Kotlin 的情况 KotlinAdapter.kt:37-39

对 mod 作者的意义

supportsStatics() 返回 false 是本适配器的关键:它让 FML 走「单例」路径, 因此 @Mod object Foo { @Mod.EventHandler fun preInit(...) } 这种写法能正常工作, 事件处理函数作为实例方法被调用,而不需要写成 companion object + @JvmStatic。

限制与前提

  • 模组必须同时使用本适配器和 Forgelin 才会生效。
  • getNewInstance 对 Kotlin object 返回的是单例;若 mod 想在同一 JVM 里有多实例, 本适配器不提供该能力。
  • ⚠️ setProxy 内的 target.set(...) 依赖 objectInstance 非空。 当被代理的 @Mod 是普通 class 而非 object 时,这里会向 set 传入 null 作为 目标对象,可能抛 NullPointerException。源码未做判空。

相关条目