Skip to content

@Unique

@Unique 注解用于标记一个字段或方法在 Mixin 中是唯一的。这意味着这个成员不应该存在于目标类中。当 Mixin 应用时,这个唯一的成员会被添加到目标类中。

用法

@Unique 确保你添加的成员不会意外地覆盖目标类中已有的成员。如果目标类中已经存在一个同名的成员,Mixin 在应用时会抛出一个错误。

添加新字段

你可以在 Mixin 中添加新的字段,并在目标类中使用它们。

示例:

java
@Mixin(Player.class)
public class PlayerMixin {
    @Unique
    private int customTimer;

    @Inject(method = "tick", at = @At("HEAD"))
    private void onTick(CallbackInfo ci) {
        this.customTimer++;
    }
}

这个例子向 Player 类添加了一个 customTimer 字段,并在 tick 方法中更新它。

添加新方法

同样地,你也可以添加新的方法。

java
@Mixin(Player.class)
public abstract class PlayerMixin implements IPlayerWithCustomLogic {
    @Unique
    private int customData;

    @Unique
    public void doCustomLogic() {
        this.customData++;
        // ...
    }
}

通常,为了能从外部调用这些新添加的方法,你会让 Mixin 实现一个接口(例如 IPlayerWithCustomLogic),然后在需要的地方将目标对象(Player)转换成该接口类型来调用新方法。

silent 属性

默认情况下,如果 @Unique 成员与目标类中的成员冲突,Mixin 会抛出错误。你可以设置 silent = true 来抑制这个错误。这在某些高级用例中可能有用,但通常不推荐,因为它可能隐藏潜在的问题。

java
@Unique(silent = true)
private void possiblyClashingMethod() {
    // ...
}

总结

  • @Unique 用于向目标类安全地添加新成员。
  • 它能防止意外的方法或字段覆盖。
  • 是实现自定义逻辑和存储自定义数据的常用方式。