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对 Kotlinobject返回的是单例;若 mod 想在同一 JVM 里有多实例, 本适配器不提供该能力。- ⚠️
setProxy内的target.set(...)依赖objectInstance非空。 当被代理的@Mod是普通class而非object时,这里会向set传入null作为 目标对象,可能抛NullPointerException。源码未做判空。
相关条目
- EventBusSubscriber 注解 - 本适配器的配套 Kotlin 注解
- ForgelinPlugin 加载入口 - 在 mod 类加载前预载本类