Skip to content

MixinExtras

MixinExtrasの利用

Mixinでは難しい痒いところに手が届くようなライブラリです。

MixinExtrasのWikiは丁寧なので、そちらも参考にしてください。

MixinExtras Wiki

主に以下のような機能を提供します。

  • 追加インジェクション
  • 構文糖
  • 高度な@At指定

導入方法

Setup - Wiki を参照してください。

注意点

MixinExtrasを使用するとMixinExtrasがjarに埋め込まれ、Modの容量が増加するため、むやみに導入するのは控えましょう。

追加インジェクション

@ModifyExpressionValue

@Redirect をより安全に、より汎用に使えるようにしたもの。

非常に便利です。

対象の式の評価結果を改変できます。

@ModifyExpressionValue(
    method = "targetMethod",
    at = @At(value = "INVOKE", target = "...")
)
private int modifyValue(int original) {
    return original + 5;
}

@ModifyReceiver

対象のメソッドコールのレシーバを改変する。

receiver.call()receiver を改変できるということです

書き方は省略します。

@ModifyReturnValue

メソッドの戻り値を改変する。

at@At("RETURN") を指定します。

非常に便利です。

@ModifyReturnValue(
    method = "targetMethod",
    at = @At("RETURN")
)
private float halveSpeed(float original) {
    return original / 2f;
}

WrapMethod

メソッドの全てをラムダ式として覆い、操作できるもの。

try-catchで覆ってメソッドを実行し、例外を抑制したり、そのメソッドを複数回実行する等に使えます。

詳しくはWikiで確認してください。

@WrapWithCondition

ある関数呼び出しをif文で囲って、条件付きで実行させるもの。

詳しくはWikiで確認してください。

構文糖

@Cancellable

@ModifyExpressionValue 等の CallbackInfo を引数として取らないインジェクション関数でもキャンセル・返り値の操作が可能になるものです。

引数の最後に @Cancellable CallbackInfo ci を追加することで使用できます。(CallbackInfoReturnable<T>も可能)

@Local

@Injectlocals をより便利にしたもの。

@Inject に限らず様々なインジェクションで使えます。非常に便利です。

これも引数の最後に使用します。

更に、LocalRef<T>LocalIntRef(プリミティブ) を型として使うことで、ローカル変数を操作することもできます。

引数(任意) * ordinal: 何番目のローカル変数か * name: 変数の名前

詳しくはWikiで確認してください。

@Share

Mixin同士でローカル変数を作成しシェアできる機能。

詳しくはWikiで確認してください。