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/01/29 13:51] – 补充一些内容 hendrix-shenzh_cn:tutorial:mixin_examples [2023/12/18 02:19] (current) – [捕获局部变量] solidblock
Line 12: Line 12:
  
 ===== 在 Mixin 类中获取目标类实例对象 ===== ===== 在 Mixin 类中获取目标类实例对象 =====
 +注意:应该避免像这样两次强转 ''this''。如果你是要使用来自目标来的方法或字段,使用 ''@Shadow''。如果方法或字段是来自目标类的父类,可以直接将你的这个 mixin 继承那个父类。
 Mixin: Mixin:
 <code java> <code java>
Line 18: Line 19:
   @Inject(method = "foo()V", at = @At("HEAD"))   @Inject(method = "foo()V", at = @At("HEAD"))
   private void injected(CallbackInfo ci) {   private void injected(CallbackInfo ci) {
-    ((TargetClass)(Object)this).methodOfTheTargetClass();+    TargetClass thisObject = (TargetClass)(Object)this;
   }   }
 } }
 </code> </code>
- 
 ===== 注入到静态初始化代码块的开头 ===== ===== 注入到静态初始化代码块的开头 =====
 Mixin: Mixin:
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.1675000277.txt.gz · Last modified: 2023/01/29 13:51 by hendrix-shen