======= 接口注入 ======= 这是由 Loom 0.11 引入的新科技,可以将方法添加到指定的已存在的类。特别地,你可以创建一个接口,然后将这个接口注入类中。这个类将会拥有该接口的所有方法,就像一直拥有这些方法一样。注入接口是仅在编译时具有的功能,这意味着需要用到 Mixin 以将接口实现到目标类。 这对库来说尤其有用,你可以给已有的类添加方法,并且可以直接使用而不需要每次都强转或重新实现接口。 Fabric API 利用了这一技术,例如,''TagBuilder'' 实现 ''FabricTagBuilder'',''BlockEntityType'' 实现 ''FabricBlockEntityType'',这样你就可以在原版类上调用 Fabric API 中的实例方法。 举个例子来更好地解释: 这个例子的场景是,将以下方法添加到 '''' 以获取桶倒空时的音效。通常来说这是不可能的,因为 '''' 没有类似方法。 Optional getBucketEmptySound$myMod() 要将方法添加到类,首先你需要为其创建方法: package net.fabricmc.example; public interface BucketEmptySoundGetter { default Optional getBucketEmptySound$myMod() { return Optional.empty(); } } :!: 接口中的方法体可能不会被使用,因为会被 mixin 类覆盖,但是,你还是必须指定方法体(也就是说方法必须为 ''default'')。你可以让它返回 null 或者抛出 ''UnsupportedOperationException'',但是//不可以//让它抽象,例如 ''Optional getBucketEmptySound()'',否则编译时就会出错! ℹ️ 强烈建议在方法名称中加入美元符号或下划线和模组名称,作为方法名称的前缀或者后缀,这样是为了避免与其他模组的方法名称冲突。 现在你需要通过实现该接口的 mixin 来将该接口实现到 '''' 中。 @Mixin(class_3609.class) public class MixinFlowableFluid implements BucketEmptySoundGetter { @Override public Optional getBucketEmptySound$myMod() { // 这是如何获取默认声音的,从 BucketItem 类中复制。 return Optional.of(((FlowableFluid) (Object) this).isIn(FluidTags.LAVA) ? SoundEvents.ITEM_BUCKET_EMPTY_LAVA : SoundEvents.ITEM_BUCKET_EMPTY); } } 最后你需要将库注入到 ''''。可以将以下片段添加到你的 ''fabric.mod.json'' 文件中,以给 '''' 类添加一个或多个接口。注意这里所有的类名称都必须使用“内部名称”并使用斜杠而非点。 { "custom": { "loom:injected_interfaces": { "net/minecraft/class_3609": ["net/fabricmc/example/BucketEmptySoundGetter"] } } } 现在你可以使用新的方法: Optional sound = mytestfluid.getBucketEmptySound$myMod(); 您还可以在继承了 ''FlowableFluid'' 的类中覆盖此方法以实现自定义行为。