謎のaccess$100メソッドの話続き。解決編。

もう少し簡単なコードで、検証でけた。

public class SuperClass {
  public void method() {
  }

  public void method2() {
  }
}
public class SubClass extends SuperClass {
  public void execute() {
    new Runnable() {
      @Override
      public void run() {
        // 謎メソッドは作成される。
        SubClass.super.method();
      }
    };
    new Runnable() {
      @Override
      public void run() {
        // 謎メソッドは作成されない。
        SubClass.this.method2();
      }
    };
  }
}

これをjavapすると。

Compiled from "SubClass.java"
public class SubClass extends SuperClass{
public SubClass();
  Code:
   0:  aload_0
   1:  invokespecial  #8; //Method SuperClass."<init>":()V
   4:  return

public void execute();
  Code:
   0:  new  #15; //class SubClass$1
   3:  aload_0
   4:  invokespecial  #17; //Method SubClass$1."<init>":(LSubClass;)V
   7:  new  #20; //class SubClass$2
   10:  aload_0
   11:  invokespecial  #22; //Method SubClass$2."<init>":(LSubClass;)V
   14:  return

static void access$0(SubClass);
  Code:
   0:  aload_0
   1:  invokespecial  #24; //Method SuperClass.method:()V
   4:  return

}

こんな感じ。と、書いたところで、

の「invokespecial」を見れ、とid:ashigeruさんからツッコミが入りましてん。
つまりまとめると、


java言語仕様ではインナークラスや無名クラスは、同一ファイル内である為、
可視性を無視してメソッドの呼び出しが出来るものの、
JVM仕様では、インナークラスも無名クラスも、別なclassである為、
単純には、メソッドの呼び出しが出来ないので、
コンパイラが物凄い勢いで頑張って、移譲処理する為のメソッドを、自動的に作っている、と言う事になりまつ。