謎の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である為、
単純には、メソッドの呼び出しが出来ないので、
コンパイラが物凄い勢いで頑張って、移譲処理する為のメソッドを、自動的に作っている、と言う事になりまつ。