Skip to content

@ModifyArgs

@ModifyArgs 注解用于一次性修改方法调用的多个参数。它比多次使用 @ModifyArg 更高效。

用法

@ModifyArgs 注解的方法需要一个 Args 类型的参数。Args 对象包含了目标方法调用的所有参数,你可以通过 getset 方法来访问和修改它们。

示例:

假设有以下目标代码:

java
public class Gui {
    public void drawString(String s, int x, int y, int color) {
        // draws a string
    }

    public void render() {
        this.drawString("Hello", 10, 10, 0xFFFFFF);
    }
}

我们可以使用 @ModifyArgs 来同时修改 drawStringxy 坐标:

java
import org.spongepowered.asm.mixin.injection.invoke.arg.Args;

@Mixin(Gui.class)
public class GuiMixin {
    @ModifyArgs(
        method = "render",
        at = @At(
            value = "INVOKE",
            target = "Lnet/example/Gui;drawString(Ljava/lang/String;III)V"
        )
    )
    private void modifyCoordinates(Args args) {
        int x = args.get(1); // get original x
        int y = args.get(2); // get original y
        args.set(1, x + 50); // set new x
        args.set(2, y + 20); // set new y
    }
}

在这个例子中,drawString 方法的 x 参数将变为 60y 参数将变为 30

Args

Args 类提供了以下方法:

  • get(int index): 获取指定索引的参数。
  • set(int index, Object value): 设置指定索引的参数。
  • setAll(Object... values): 一次性设置所有参数。
  • size(): 获取参数的数量。

使用 setAll 的示例:

java
@ModifyArgs(
    method = "render",
    at = @At(
        value = "INVOKE",
        target = "Lnet/example/Gui;drawString(Ljava/lang/String;III)V"
    )
)
private void modifyAll(Args args) {
    args.setAll("New string", 100, 100, 0xFF00FF);
}

这会替换 drawString 的所有参数。