private なメンバはその宣言を囲むトップレベルクラスの中で参照できる
JLS2 6.6.1 より。
class PrivateField { private int private_i; private void private_meth() { } int test() { Internal obj = new Internal(); return obj.private_j; } class Inner { private int private_j; int read() { return private_i; } void write() { private_i = 0; } void call() { private_meth(); } } }
この例でPrivateFiledクラスのprivateフィールドの読み書きやprivateメソッドの呼び出しをInnerクラスから行うために、PrivateFieldクラスには特別なアクセスメソッドがコンパイラにより追加される。
static int access$100(PrivateField); Code: 0: aload_0 1: getfield #2; //Field private_i:I 4: ireturn static int access$102(PrivateField,int); Code: 0: aload_0 1: iload_1 2: dup_x1 3: putfield #2; //Field private_i:I 6: ireturn static void access$200(PrivateField); Code: 0: aload_0 1: invokespecial #1; //Method private_meth:()V 4: return }
Innerクラスについても同様に、そのprivateフィールドをPrivateFieldクラスから読み書きするために特別なアクセスメソッドが自動的に追加される。