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
Last revisionBoth sides next revision
zh_cn:tutorial:mixin_examples [2021/11/20 12:53] – external edit 127.0.0.1zh_cn:tutorial:mixin_examples [2023/12/18 02:10] – [使用偏移注入到一个方法调用之前] solidblock
Line 1: Line 1:
 ====== Mixin 示例 ====== ====== Mixin 示例 ======
-收录了较为常见的 Mixin 示例.+收录了较为常见的 Mixin 示例。此页面旨在帮助开发者快速学习 Mixin 的使用,建议在开始之前先查看 [[zh_cn:tutorial:mixin_introduction|Mixin介绍]]。 
 + 
 +===== 注入到内部私有类的一个方法 ===== 
 +使用 targets 参数并添加 ''$'' 符号来指向内部类。 
 +<code java> 
 +@Mixin(targets = "net.minecraft.client.render.block.BlockModelRenderer$AmbientOcclusionCalculator"
 +public class AmbientOcclusionCalculatorMixin { 
 +    // 为所欲为 ^ v ^ 
 +
 +</code> 
 + 
 +===== 在 Mixin 类中获取目标类实例对象 ===== 
 +注意:应该避免像这样两次强转 ''this''。如果你是要使用来自目标来的方法或字段,使用 ''@Shadow''。如果方法或字段是来自目标类的父类,可以直接将你的这个 mixin 继承那个父类。 
 +Mixin: 
 +<code java> 
 +@Mixin(TargetClass.class) 
 +public class MyMixin extends EveryThingThatTargetClassExtends implements EverythingThatTargetClassImplements { 
 +  @Inject(method = "foo()V", at = @At("HEAD")) 
 +  private void injected(CallbackInfo ci) { 
 +    TargetClass thisObject = (TargetClass)(Object)this; 
 +  } 
 +
 +</code> 
 +===== 注入到静态初始化代码块的开头 ===== 
 +Mixin: 
 +<code java> 
 +@Inject(method = "<clinit>", at = @At("HEAD")) 
 +private void injected(CallbackInfo ci) { 
 +    doSomething3(); 
 +
 +</code> 
 + 
 +结果: 
 +<code diff> 
 +static { 
 ++   injected(new CallbackInfo(“<clinit>”, false)); 
 +    doSomething1(); 
 +    doSomething2(); 
 +
 +</code>
  
 ===== 注入在一个方法的开头 ===== ===== 注入在一个方法的开头 =====
Line 101: Line 140:
 +   injected(new CallbackInfo("foo", false)); +   injected(new CallbackInfo("foo", false));
     doSomething2();     doSomething2();
 +  }
 +</code>
 +
 +===== 使用偏移量注入 =====
 +Mixin:
 +<code java>
 +@Inject(method = "foo()V", at = @At(value = "INVOKE", target = "La/b/c/Something;doSomething()V", shift = At.Shift.BY, by = 2))
 +private void injected(CallbackInfo ci) {
 +  doSomething3();
 +}
 +</code>
 +
 +结果:
 +<code diff>
 +  public void foo() {
 +    doSomething1();
 +    Something something = new Something();
 +    something.doSomething();
 +    doSomething2();
 ++   injected(new CallbackInfo("foo", false));
   }   }
 </code> </code>
Line 181: Line 240:
     doSomething3();     doSomething3();
     return 10;     return 10;
 +  }
 +</code>
 +
 +===== 捕获局部变量 =====
 +
 +Mixin:
 +<code java>
 +@Inject(method = "foo()V", at = @At(value = "TAIL"), locals = LocalCapture.CAPTURE_FAILHARD)
 +private void injected(CallbackInfo ci, TypeArg1 arg1) {
 +  //CAPTURE_FAILHARD: 如果计算局部变量与预期不符则抛出一个异常。
 +  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), arg1);
   }   }
 </code> </code>
zh_cn/tutorial/mixin_examples.txt · Last modified: 2023/12/18 02:19 by solidblock