You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:14:52