访问内部匿名类成员

Sar*_*n M 6 java anonymous-class

除了使用反射来访问匿名内部类的成员之外,还有其他方法吗?

Iva*_*rov 9

您可以使用本地类而不是匿名类.看:

public class Test {
    public static void main(String... args) {
        class MyInner {
            private int value = 10;
        }

        MyInner inner = new MyInner();
        System.out.println(inner.value);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以MyInner仅在方法体中引用类型.因此,在方法之外,您将无法使用未在其超类(java.lang.Object在本例中)或接口中声明的字段/方法.


Tom*_*ine 9

匿名内部类具有类型但没有名称.

您可以访问未由命名超类型定义的字段.但是,一旦分配给命名类型变量,接口就会丢失.

显然,您可以从内部类本身访问字段.添加代码的一种方法是通过实例初始化器:

final AtomicInteger y = new AtomicInteger();
new Runnable() {
    int x;
    {
        x = 5;
        doRun(this);
        y.set(x);
    }
    public void run() {
        ... blah ...
    }
};
Run Code Online (Sandbox Code Playgroud)

匿名内部类表达式返回的值具有匿名类型,因此您有一次机会在类本身之外使用它:

final int y = new Runnable() {
    int x;
    {
        x = 5;
        doRun(this);
    }
    public void run() {
        ... blah ...
    }
}.x;
Run Code Online (Sandbox Code Playgroud)

您还可以通过类似于以下方式声明的方法传递它:

<T extends Runnable> T doRun(T runnable);
Run Code Online (Sandbox Code Playgroud)