除了使用反射来访问匿名内部类的成员之外,还有其他方法吗?
您可以使用本地类而不是匿名类.看:
public class Test { public static void main(String... args) { class MyInner { private int value = 10; } MyInner inner = new MyInner(); System.out.println(inner.value); } }
您可以MyInner
仅在方法体中引用类型.因此,在方法之外,您将无法使用未在其超类(java.lang.Object
在本例中)或接口中声明的字段/方法.
匿名内部类具有类型但没有名称.
您可以访问未由命名超类型定义的字段.但是,一旦分配给命名类型变量,接口就会丢失.
显然,您可以从内部类本身访问字段.添加代码的一种方法是通过实例初始化器:
final AtomicInteger y = new AtomicInteger(); new Runnable() { int x; { x = 5; doRun(this); y.set(x); } public void run() { ... blah ... } };
匿名内部类表达式返回的值具有匿名类型,因此您有一次机会在类本身之外使用它:
final int y = new Runnable() { int x; { x = 5; doRun(this); } public void run() { ... blah ... } }.x;
您还可以通过类似于以下方式声明的方法传递它:
T doRun(T runnable);