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)
为什么?
为什么?
这是因为它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)
如果我不能使用公共字段,为什么它会让我公开?
如果它不允许你创建公共领域,即使反射也不适合你,至少不像上面那样简单.