User Tools

Site Tools


zh_cn:tutorial:mixin_examples

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:mixin_examples [2023/12/18 02:09] – [在 Mixin 类中获取目标类实例对象] solidblockzh_cn:tutorial:mixin_examples [2023/12/18 02:19] (current) – [捕获局部变量] solidblock
Line 143: Line 143:
 </code> </code>
  
-===== 使用偏移注入到一个方法调用之前 =====+===== 使用偏移注入 =====
 Mixin: Mixin:
 <code java> <code java>
Line 244: Line 244:
  
 ===== 捕获局部变量 ===== ===== 捕获局部变量 =====
 +==== 不用 MixinExtras 捕获局部变量 ====
  
 Mixin: Mixin:
Line 266: Line 267:
 </code> </code>
  
 +
 +==== 使用 MixinExtras 捕获局部变量 ====
 +:!: MixinExtras 需要 Fabric Loader 0.15 或者以上版本,否则你需要在 ''build.gradle'' 中手动指定。
 +
 +:!: 如果有多个同一类型的局部变量,你需要指定 ''ordinal'' 否则会抛出错误。
 +
 +Mixin:
 +<code java>
 +@Inject(method = "foo()V", at = @At(value = "TAIL"))
 +private void injected(CallbackInfo ci, @Local TypeArg2 arg2) {
 +  arg1.doSomething4();
 +}
 +</code>
 +
 +结果:
 +<code diff>
 +  public void foo() {
 +    TypeArg1 arg1 = getArg1();
 +    arg1.doSomething1();
 +    arg1.doSomething2();
 +    TypeArg2 arg2 = getArg2();
 +    arg2.doSomething3();
 ++   injected(new CallbackInfo("foo", false), arg2);
 +  }
 +</code>
 +
 +==== 捕获多个同一类型的局部变量中的一个 ====
 +Mixin:
 +<code java>
 +@Inject(method = "foo()V", at = @At(value = "TAIL"))
 +private void injected(CallbackInfo ci, @Local(ordinal = 2) TypeArg arg) {
 +  arg1.doSomething4();
 +}
 +</code>
 +
 +结果:
 +<code diff>
 +  public void foo() {
 +    TypeArg arg1 = getArg1();
 +    TypeArg arg2 = getArg2();
 +    TypeArg arg3 = getArg3();
 +    TypeArg arg4 = getArg4();
 +    doSomething();
 ++   injected(new CallbackInfo("foo", false), arg3);
 +  }
 +</code>
 ===== 修改返回值 ===== ===== 修改返回值 =====
 Mixin: Mixin:
zh_cn/tutorial/mixin_examples.1702865382.txt.gz · Last modified: 2023/12/18 02:09 by solidblock