synthetic accessor
ついでに。
public class N { public class A { private int a; } public void f() { int x = new A().a; new A().a = 1; } }
これは、次のようにプログラム変換される模様 (javac)。
public class N { public class A { private int a; /* synthetic */ static int access$000(A $0) { return $0.a; } /* synthetic */ static void access$002(A $0, int $1) { $0.a = $1; } } public void f() { int x = A.access$000(new A()); A.access$002(new A(), 1); } }
Javassistとか使ってたりすると、access$xxxまで読みに行かなきゃならんので大変ですね。
じゃあついでに、下のようなプログラムを書いてみる*1。
public class N { public class A { private int a; int access$000(A $0) { return $0.a; } } public void f() { A a = new A(); int x = a.access$000(a); int y = a.a; } }
そしてコンパイル。
>javac N.java N.java:11: シンボル access$000(N.A) が、N.A でコンパイラが合成したシンボルと競合 します。 int y = a.a; ^ エラー 1 個
この手のいやがらせには毅然とした態度で臨む模様。さすが。
*1:メンバ型にはstaticなメソッドを作れないので、しょうがなくstaticをはずしてます