You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minecraft Fabric开发Mixin Accessor访问私有字段转换失败问题

Mixin Accessor转换失败问题排查

问题场景

通过Mixin Accessor获取MultiplayerScreen类私有字段时,运行抛出转换异常。

相关代码

Accessor实现

package ru.flexice.mixin;

import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.network.ServerInfo;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(MultiplayerScreen.class)
public interface MultiplayerScreenAccessor {
    @Accessor
    ServerInfo getSelectedEntry();
}

注入逻辑

@Inject(at = @At("RETURN"), method = "select")
private void select(CallbackInfo callbackInfo) {
    try {
        Screen s = MinecraftClient.getInstance().currentScreen;
        if (s != null) {
            System.out.println(((MultiplayerScreenAccessor) s).getSelectedEntry().address);
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

运行报错

Mixin transformation of ru.flexice.mixin.MultiplayerScreenAccessor failed

故障原因与修复

该报错的核心原因是Mixin处理器无法在目标类中找到Accessor映射的对应成员,常见触发点有两个:

  • 字段名不匹配:当前编写的getSelectedEntry()默认映射目标类中名为selectedEntry的字段,但MultiplayerScreen中存储选中服务器条目的私有字段实际名为selectedServer,类型为ServerInfo。
    修复方式:要么将Accessor方法名修改为getSelectedServer()匹配字段命名规则,要么在@Accessor注解中显式指定目标字段名:
    @Accessor("selectedServer")
    ServerInfo getSelectedEntry();
    
  • Mixin未注册:检查mixins.json配置文件,确认MultiplayerScreenAccessor已经被添加到对应运行环境(客户端)的mixin加载列表中,未注册的Accessor不会被Mixin处理器处理,同样会抛出该错误。

额外优化点:注入的select方法本身就属于MultiplayerScreen类,方法内的this就是当前类实例,不需要再通过MinecraftClient.getInstance().currentScreen获取当前屏幕再强转,直接强转this即可,能避免类型不匹配的异常。


内容的提问来源于stack exchange,提问作者FlexICE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 20:27:21