如何在SpongePowered Mixin中从内部类访问外部类实例?
解决非静态嵌套类Mixin引用外部类字段的问题
非静态内部类在编译时会自动生成一个名为this$0的私有字段,用于持有外部类的实例,但Mixin类并非目标内部类的真正嵌套类,因此直接使用Outer.this.x的语法会编译失败。
解决方案步骤
- 使用
@Shadow注解注入内部类持有的外部类实例引用(即字节码中的this$0字段) - 通过该阴影字段访问外部类的目标字段
修改后的Mixin代码
package your.mixin.package; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import whatever.Outer; @Mixin(targets = "whatever.Outer$Inner") public class InnerMixin { // 阴影注入外部类实例,字段名固定为this$0 @Shadow private Outer this$0; @Overwrite public void foo() { // 通过外部类实例访问x字段 System.out.println(this$0.x); } }
补充说明
this$0是非静态内部类字节码层面默认生成的外部引用字段,字段名和访问修饰符是固定的- 若外部类的
x字段为私有,也可以直接通过@Shadow注入该字段(需确保Mixin能访问到),但通过this$0访问更贴合原内部类的逻辑,也能避免权限问题
内容的提问来源于stack exchange,提问作者Zachary Barbanell
相关产品推荐
相关产品推荐

