zh_cn:tutorial:mixin_examples
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:mixin_examples [2021/11/20 12:53] – external edit 127.0.0.1 | zh_cn:tutorial:mixin_examples [2023/12/18 02:19] (current) – [捕获局部变量] solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Mixin 示例 ====== | ====== Mixin 示例 ====== | ||
- | 收录了较为常见的 Mixin 示例. | + | 收录了较为常见的 Mixin 示例。此页面旨在帮助开发者快速学习 Mixin 的使用,建议在开始之前先查看 [[zh_cn: |
+ | |||
+ | ===== 注入到内部私有类的一个方法 ===== | ||
+ | 使用 targets 参数并添加 '' | ||
+ | <code java> | ||
+ | @Mixin(targets = "net.minecraft.client.render.block.BlockModelRenderer$AmbientOcclusionCalculator" | ||
+ | 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(); | ||
+ | } | ||
+ | </ | ||
===== 注入在一个方法的开头 ===== | ===== 注入在一个方法的开头 ===== | ||
Line 101: | Line 140: | ||
+ | + | ||
doSomething2(); | doSomething2(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== 使用偏移量注入 ===== | ||
+ | Mixin: | ||
+ | <code java> | ||
+ | @Inject(method = " | ||
+ | private void injected(CallbackInfo ci) { | ||
+ | doSomething3(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 结果: | ||
+ | <code diff> | ||
+ | public void foo() { | ||
+ | doSomething1(); | ||
+ | Something something = new Something(); | ||
+ | something.doSomething(); | ||
+ | doSomething2(); | ||
+ | + | ||
} | } | ||
</ | </ | ||
Line 184: | Line 243: | ||
</ | </ | ||
+ | ===== 捕获局部变量 ===== | ||
+ | ==== 不用 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: |
zh_cn/tutorial/mixin_examples.txt · Last modified: 2023/12/18 02:19 by solidblock