如果匿名内部类有两个外部类,我该如何获取外部类的引用?

3
public class OuterClass {
    public class InnerClass{
         void test(){
         };
    }
}

class Client{
    public void x(){}
    public void lucian() {
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass(){
            void test() {
                Client.this.x();
                x();
                ******** // how can I get the reference of the OuterClass at here? ********
            }
        };
        innerClass.test();
    }
}

我知道编译器将为具有两个参数的匿名内部类生成构造函数,其中一个是客户端的引用,另一个是外部类。 但是在test()方法中如何获取OuterClass的引用,就像使用Client.this获取客户端引用一样? 不是Client.this!!而是在客户端中的OuterClass引用。


你为什么想要这样做? - Uwe Allner
@UweAllner,他只是想让我思考一下评论者提出的问题... :) - lxacoder
2个回答

1
你做不到。无论如何都不能使用疯狂的反射技巧来实现。所以,只需将其写出即可:
public void lucian() {
    OuterClass oc = new OuterClass();
    OuterClass.InnerClass ic = oc.new InnerClass() {
        void test() {
            Client.this.x();
            x();
            oc.x();
        }
    };
    ic.test();
}

NB: 非静态内部类很奇怪,而且很少正确使用。初学者Java编程员不应该使用它们;高级Java编程员应该仔细思考。无论如何,您内部类的默认选择应该始终是静态的。


除了反射,是否有其他方法可以获取OuterClass的引用,就像OuterClass.this或OuterClass$1.this一样?我知道我可以像Client.this一样获取客户端的引用。 - lxacoder
没有办法。 - rzwitserloot

1
你可以保存对OuterClass对象的引用(到目前为止,你是匿名创建它的):
class Client{

    private OuterClass outerClass;

    public OuterClass getOuterClass() {
        return outerClass;
    }

    public void setOuterClass(OuterClass outerClass) {
        this.outerClass = outerClass;
    }

    public void x(){
        System.out.println("===");
    }
    public void lucian() {
        OuterClass outerClass = new OuterClass();
        setOuterClass(outerClass);
        OuterClass.InnerClass innerClass = outerClass.new InnerClass(){
            void test() {
                Client1.this.x();
                x();
                System.out.println(getOuterClass());
            }
        };
        innerClass.test();
    }
    public static void main(String[] args) {
        Client client = new Client();
        client.lucian();
    }

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接