zh_cn:tutorial:mixin_examples
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| zh_cn:tutorial:mixin_examples [2021/08/29 11:09] – 暂定填充页面 hendrix-shen | zh_cn:tutorial:mixin_examples [2023/12/18 02:19] (current) – [捕获局部变量] solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Mixin 示例 ====== | ====== Mixin 示例 ====== | ||
| - | 收录了较为常见的 Mixin 示例. | + | 收录了较为常见的 Mixin 示例。此页面旨在帮助开发者快速学习 Mixin 的使用,建议在开始之前先查看 [[zh_cn: |
| - | ===== Injecting into the head of a method ===== | + | ===== 注入到内部私有类的一个方法 ===== |
| + | 使用 targets 参数并添加 '' | ||
| + | <code java> | ||
| + | @Mixin(targets = " | ||
| + | public class AmbientOcclusionCalculatorMixin { | ||
| + | // 为所欲为 ^ v ^ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 在 Mixin 类中获取目标类实例对象 ===== | ||
| + | 注意:应该避免像这样两次强转 '' | ||
| + | Mixin: | ||
| + | <code java> | ||
| + | @Mixin(TargetClass.class) | ||
| + | public class MyMixin extends EveryThingThatTargetClassExtends implements EverythingThatTargetClassImplements { | ||
| + | @Inject(method | ||
| + | private void injected(CallbackInfo ci) { | ||
| + | TargetClass thisObject = (TargetClass)(Object)this; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ===== 注入到静态初始化代码块的开头 ===== | ||
| + | Mixin: | ||
| + | <code java> | ||
| + | @Inject(method = "< | ||
| + | private void injected(CallbackInfo ci) { | ||
| + | doSomething3(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 结果: | ||
| + | <code diff> | ||
| + | static { | ||
| + | + | ||
| + | doSomething1(); | ||
| + | doSomething2(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 注入在一个方法的开头 | ||
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 11: | Line 50: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 21: | Line 60: | ||
| </ | </ | ||
| - | ===== Injecting into the tail of a method | + | ===== 注入到一个方法的结尾 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 30: | Line 69: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 42: | Line 81: | ||
| </ | </ | ||
| - | ===== Injecting into the returns of a method | + | ===== 注入到一个方法的返回之前 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 51: | Line 90: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 64: | Line 103: | ||
| </ | </ | ||
| - | ===== Injecting into the point before a method call ===== | + | ===== 注入到一个方法调用之前 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 73: | Line 112: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 84: | Line 123: | ||
| </ | </ | ||
| - | ===== Injecting into the point after a method call ===== | + | ===== 注入到一个方法调用之后 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 93: | Line 132: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 104: | Line 143: | ||
| </ | </ | ||
| - | ===== Injecting with a slice ===== | + | ===== 使用偏移量注入 ===== |
| + | Mixin: | ||
| + | <code java> | ||
| + | @Inject(method = " | ||
| + | private void injected(CallbackInfo ci) { | ||
| + | doSomething3(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 结果: | ||
| + | <code diff> | ||
| + | public void foo() { | ||
| + | doSomething1(); | ||
| + | Something something = new Something(); | ||
| + | something.doSomething(); | ||
| + | doSomething2(); | ||
| + | + | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 使用 Slice 控制注入范围 | ||
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 123: | Line 182: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public class Something { | public class Something { | ||
| public void foo() { | public void foo() { | ||
| this.doSomething1(); | this.doSomething1(); | ||
| - | + // | + | + // |
| this.doSomething(); | this.doSomething(); | ||
| this.doSomething2(); | this.doSomething2(); | ||
| Line 134: | Line 193: | ||
| this.doSomething(); | this.doSomething(); | ||
| this.doSomething3(); | this.doSomething3(); | ||
| - | + // | + | + // |
| this.doSomething(); | this.doSomething(); | ||
| this.doSomething4(); | this.doSomething4(); | ||
| Line 141: | Line 200: | ||
| </ | </ | ||
| - | ===== Injecting and cancelling | + | ===== 注入并直接使当前方法返回 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 150: | Line 209: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 162: | Line 221: | ||
| </ | </ | ||
| - | ===== Injecting and cancelling with a return value ===== | + | ===== 注入并使当前方法返回指定返回值 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 171: | Line 230: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public int foo() { | public int foo() { | ||
| Line 184: | Line 243: | ||
| </ | </ | ||
| - | ===== Modifying a return | + | ===== 捕获局部变量 ===== |
| + | ==== 不用 MixinExtras 捕获局部变量 ==== | ||
| + | |||
| + | Mixin: | ||
| + | <code java> | ||
| + | @Inject(method = " | ||
| + | private void injected(CallbackInfo ci, TypeArg1 arg1) { | ||
| + | // | ||
| + | arg1.doSomething4(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 结果: | ||
| + | <code diff> | ||
| + | public void foo() { | ||
| + | TypeArg1 arg1 = getArg1(); | ||
| + | arg1.doSomething1(); | ||
| + | arg1.doSomething2(); | ||
| + | TypeArg2 arg2 = getArg2(); | ||
| + | arg2.doSomething3(); | ||
| + | + | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== 使用 MixinExtras 捕获局部变量 ==== | ||
| + | :!: MixinExtras 需要 Fabric Loader 0.15 或者以上版本,否则你需要在 '' | ||
| + | |||
| + | :!: 如果有多个同一类型的局部变量,你需要指定 '' | ||
| + | |||
| + | Mixin: | ||
| + | <code java> | ||
| + | @Inject(method = " | ||
| + | private void injected(CallbackInfo ci, @Local TypeArg2 arg2) { | ||
| + | arg1.doSomething4(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 结果: | ||
| + | <code diff> | ||
| + | public void foo() { | ||
| + | TypeArg1 arg1 = getArg1(); | ||
| + | arg1.doSomething1(); | ||
| + | arg1.doSomething2(); | ||
| + | TypeArg2 arg2 = getArg2(); | ||
| + | arg2.doSomething3(); | ||
| + | + | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== 捕获多个同一类型的局部变量中的一个 ==== | ||
| + | Mixin: | ||
| + | <code java> | ||
| + | @Inject(method = " | ||
| + | private void injected(CallbackInfo ci, @Local(ordinal = 2) TypeArg arg) { | ||
| + | arg1.doSomething4(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 结果: | ||
| + | <code diff> | ||
| + | public void foo() { | ||
| + | TypeArg arg1 = getArg1(); | ||
| + | TypeArg arg2 = getArg2(); | ||
| + | TypeArg arg3 = getArg3(); | ||
| + | TypeArg arg4 = getArg4(); | ||
| + | doSomething(); | ||
| + | + | ||
| + | } | ||
| + | </ | ||
| + | ===== 修改返回值 | ||
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 193: | Line 322: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public int foo() { | public int foo() { | ||
| Line 207: | Line 336: | ||
| </ | </ | ||
| - | ===== Redirecting a method call ===== | + | ===== 重定向一个方法调用 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 216: | Line 345: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 227: | Line 356: | ||
| </ | </ | ||
| - | ===== Redirecting a get field ===== | + | ===== 重定向获取到的字段值 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 236: | Line 365: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public class Something { | public class Something { | ||
| Line 251: | Line 380: | ||
| </ | </ | ||
| - | ===== Redirecting a put field ===== | + | ===== 重定向一个字段的赋值 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 260: | Line 389: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| Line 274: | Line 403: | ||
| </ | </ | ||
| - | ===== Modifying an argument | + | ===== 修改调用方法的一个参数 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 283: | Line 412: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 294: | Line 423: | ||
| </ | </ | ||
| - | ===== Modifying multiple arguments | + | ===== 修改调用方法的多个参数 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 308: | Line 437: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 314: | Line 443: | ||
| Something something = new Something(); | Something something = new Something(); | ||
| - | - | ||
| - | + // | + | + // |
| - | + // | + | + // |
| + Args args = new Args(new Object[] { 3, 2.5D, true }); | + Args args = new Args(new Object[] { 3, 2.5D, true }); | ||
| + | + | ||
| Line 323: | Line 452: | ||
| </ | </ | ||
| - | ===== Modifying a parameter | + | ===== 修改一个接收参数 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 332: | Line 461: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo(boolean b, int x, int y, int z) { | public void foo(boolean b, int x, int y, int z) { | ||
| Line 342: | Line 471: | ||
| </ | </ | ||
| - | ===== Modifying a local variable on an assignment | + | ===== 在赋值时修改一个局部变量 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 351: | Line 480: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
| Line 362: | Line 491: | ||
| </ | </ | ||
| - | ===== Modifying a constant | + | ===== 修改一个常量 |
| Mixin: | Mixin: | ||
| <code java> | <code java> | ||
| Line 371: | Line 500: | ||
| </ | </ | ||
| - | Result: | + | 结果: |
| <code diff> | <code diff> | ||
| public void foo() { | public void foo() { | ||
zh_cn/tutorial/mixin_examples.1630235384.txt.gz · Last modified: 2021/08/29 11:09 by hendrix-shen