如何访问匿名对象内声明的字段?

Dog*_*Dog 2 java visibility anonymous-class inner-classes

Java允许你在匿名类中声明新字段,但我无法弄清楚如何从外部访问它们,即使将它们设置为公共也不会让我.

class A {
   public static void main(String[] args) {
       Object o = new Object() {
           public int x = 0;
           {
               System.out.println("x: " + x++);
               System.out.println("x: " + x++);
           }
       };
       System.out.println(o.x);
   }
}
Run Code Online (Sandbox Code Playgroud)

我得到这个编译器错误:

$ javac A.java && java A
A.java:10: cannot find symbol
symbol  : variable x
location: class java.lang.Object
       System.out.println(o.x);
                           ^
1 error
Run Code Online (Sandbox Code Playgroud)

为什么?

Mar*_*nik 6

为什么?

这是因为它Object是变量的静态类型o,并且Object没有属性x.由于完全相同的原因,以下无法编译:

public class X {
  public int x;

  public static void main(String[] args) {
    Object o = new X();
    o.x = 3;
  }
}
Run Code Online (Sandbox Code Playgroud)

希望您的Java直觉在这个示例中是正确的,并且您希望这会失败.所以只需将直觉移植到你的例子中.

如何访问匿名对象内声明的字段?

与您x在我的示例中访问的方式相同:反射.

Object o = new X();
o.getClass().getField("x").setInt(o, 3);
Run Code Online (Sandbox Code Playgroud)

如果我不能使用公共字段,为什么它会让我公开?

如果它不允许你创建公共领域,即使反射也不适合你,至少不像上面那样简单.