在Java中,当我不在内部类中时,如何访问外部类?

2022-09-01 09:31:53

如果我有一个内部类的实例,如何从不在内部类中的代码访问外部类?我知道在内部类中,我可以用来获取外部类,但我找不到任何外部方法来获取它。Outer.this

例如:

public class Outer {
  public static void foo(Inner inner) {
    //Question: How could I write the following line without
    //  having to create the getOuter() method?
    System.out.println("The outer class is: " + inner.getOuter());
  }
  public class Inner {
    public Outer getOuter() { return Outer.this; }
  }
}

答案 1

该类的字节码将包含一个名为 类型的包范围的字段。这就是非静态内部类在Java中的实现方式,因为在字节码级别没有内部类的概念。Outer$Innerthis$0Outer

如果您真的愿意,您应该能够使用反射来读取该字段。我从来没有做过任何需要,所以你最好改变设计,这样它就不需要了。

下面是使用反射时示例代码的外观。伙计,这太丑了。;)

public class Outer {
    public static void foo(Inner inner) {
        try {
            Field this$0 = inner.getClass().getDeclaredField("this$0");
            Outer outer = (Outer) this$0.get(inner);
            System.out.println("The outer class is: " + outer);

        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public class Inner {
    }

    public void callFoo() {
        // The constructor of Inner must be called in 
        // non-static context, inside Outer.
        foo(new Inner()); 
    }

    public static void main(String[] args) {
        new Outer().callFoo();
    }
}

答案 2

根据设计,没有办法。如果你需要通过内部类的实例访问外部类,那么你的设计是反向的:内部类的点通常只在外部类内使用,或者通过接口使用。