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
相关产品推荐
相关产品推荐

