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をはずしてます