@ModifyArgs
@ModifyArgs 注解用于一次性修改方法调用的多个参数。它比多次使用 @ModifyArg 更高效。
用法
@ModifyArgs 注解的方法需要一个 Args 类型的参数。Args 对象包含了目标方法调用的所有参数,你可以通过 get 和 set 方法来访问和修改它们。
示例:
假设有以下目标代码:
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 来同时修改 drawString 的 x 和 y 坐标:
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 参数将变为 60,y 参数将变为 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 的所有参数。