@ModifyVariable
@ModifyVariable 注解用于修改方法中的局部变量。
属性
method
method 属性指定了包含要修改局部变量的方法。
at
at 属性使用 @At 注解来指定在何处修改变量。
index / ordinal
你可以使用 index (或 ldc / var / arg) 或 ordinal 来指定要修改的变量。
index: 局部变量表中的索引。ordinal: 如果有多个相同类型的变量,ordinal用于选择第几个(从0开始)。
name
你也可以通过 name 属性来指定变量名。这通常比使用索引更清晰。
用法
@ModifyVariable 注解的方法应该返回与要修改的变量相同的类型,并接受一个同类型的参数(原始变量值)。
示例:
假设目标方法如下:
java
public void applyDamage(int damage) {
int finalDamage = damage * 2;
// ... deal finalDamage
}我们可以修改 finalDamage 变量:
java
@Mixin(Example.class)
public class ExampleMixin {
@ModifyVariable(
method = "applyDamage",
at = @At("STORE"), // after the variable is stored
name = "finalDamage"
)
private int modifyFinalDamage(int originalDamage) {
return originalDamage / 2;
}
}@At("STORE") 表示在变量被赋值后立即修改它。在这个例子中,finalDamage 的值将从 damage * 2 变为 (damage * 2) / 2,也就是 damage。
修改方法参数
@ModifyVariable 也可以用来修改方法的参数,因为它们也被看作是局部变量。
示例:
java
@Mixin(Example.class)
public class ExampleMixin {
@ModifyVariable(
method = "applyDamage",
at = @At("HEAD"),
argsOnly = true // only look at arguments
)
private int modifyDamageArgument(int damage) {
return 0; // Negate all damage
}
}这里 argsOnly = true 是一个好习惯,它告诉 Mixin 只在方法的参数中查找要修改的变量。at = @At("HEAD") 表示在方法开始时就修改参数。