Skip to content

@Final

@Final 本身不是一个 Mixin 注解,而是 Java 的一个关键字。但在 Mixin 的上下文中,它与 @Shadow 结合使用时有特殊的意义。

@Shadow a final field

当你需要 shadow 一个 final 字段时,你必须在你的 @Shadow 声明中也包含 final 关键字。

示例:

目标类:

java
public class Block {
    private final String translationKey;
}

Mixin:

java
@Mixin(Block.class)
public class BlockMixin {
    @Shadow
    private final String translationKey;

    @Inject(method = "onUse", at = @At("HEAD"))
    private void onUse(CallbackInfo ci) {
        if (this.translationKey.equals("block.minecraft.chest")) {
            // ...
        }
    }
}

@Mutable

如果你想要修改一个 final 字段的值,你需要额外使用 @Mutable 注解。

java
@Mixin(Block.class)
public abstract class BlockMixin {
    @Mutable
    @Shadow
    private final String translationKey;

    public void setTranslationKey(String newKey) {
        this.translationKey = newKey;
    }
}

没有 @Mutable 注解,尝试给一个 final@Shadow 字段赋值会导致编译错误。