Java 访问内部匿名类成员

Java 访问内部匿名类成员,java,anonymous-class,Java,Anonymous Class,除了使用反射来访问匿名内部类的成员之外,还有其他方法吗?如果它实现了一个接口或扩展了一个现有类,您可以访问接口或基类中定义的成员。Fooz先生是对的,只是接口只能定义常量成员。最好的方法是将getter/setter方法添加到接口中,然后使用这些方法获取您的值。但是对于每个匿名类,您必须定义这些方法(有点麻烦) 您可以使用本地类而不是匿名类。看: public class Test { public static void main(String... args) { c

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

如果它实现了一个接口或扩展了一个现有类,您可以访问接口或基类中定义的成员。

Fooz先生是对的,只是接口只能定义常量成员。最好的方法是将getter/setter方法添加到接口中,然后使用这些方法获取您的值。但是对于每个匿名类,您必须定义这些方法(有点麻烦)

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

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,在本例中为
)或接口中声明。

匿名内部类有一个类型,但没有名称


public class AccessAnonymous {
    private Runnable runnable; // to have instance of the class

    public static void main(String[] args) throws Exception {
        AccessAnonymous a = new AccessAnonymous();
        a.a(); // init field

        Class clazz = a.runnable.getClass();
        Field field = clazz.getDeclaredField("i");
        field.setAccessible(true);

        int int1 = field.getInt(a.runnable);
        System.out.println("int1=" + int1);
    }

    public void a() {
        runnable = new Runnable() {
            private int i = 1;

            public void run() {
                i = 90;
            }

        };
        runnable.run();// change value
    }
}
您可以访问命名超类型未定义的字段。但是,一旦分配给命名类型变量,接口就会丢失

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

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 extends Runnable> T doRun(T runnable);
T多伦(T可运行);

如果您想要可读、可维护的代码,请不要使用匿名类。如果您使用匿名类并且想要可读、可维护的代码,那么当您需要访问该内部类中的元素时,不要使用匿名类。有很多方法可以做到这一点,但我恳请你不要使用这些黑客。可读性胜过所有其他优点。

在匿名类的情况下,类造成的混乱和匿名性带来的便利之间也有一个折衷。复杂类很少属于匿名类,而属于命名的私有类

在大多数匿名类中,我们只需要“输入”知识,就可以在构建时完成。 在一些匿名类(例如,返回值载体)中,我们还关心一个返回值


我们知道,不应该直接访问数据成员,而应该使用getter setter。这是因为,如果您发现自己处于添加了大量getter和setter的情况下,那么无论如何您都可能做错了什么,不应该使用匿名类。

请问您为什么要这样做?一些上下文。。即使可能,也不确定这是否是个好主意。我没有任何具体的用例。只是想知道除了反射之外,是否还有其他机制可以查询/访问对象成员W。。。以前从没见过。奇怪的我不能说我很喜欢它,但很有趣:)它们被称为本地类。如果我没有错的话,您展示的类只是另一个可见性有限的类。。正确的?我的意思是要知道对匿名类对象成员的可能访问。方法和字段一样是它们类型的成员。