@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 字段赋值会导致编译错误。