第1回JVM ソースコードリーディングの会に参加しました
ちょっと準備不足感は否めなかったかな的な、でも楽しかったです。
途中少し出てきた話のまとめ。
というのがあって、
m:~/src/java % cat Hoge.java public class Hoge { private interface Huga { } private Hoge() { } public static String f(Huga huga) { return huga.toString(); } } m:~/src/java % javac Hoge.java m:~/src/java % javap -c Hoge Compiled from "Hoge.java" public class Hoge extends java.lang.Object{ public static java.lang.String f(Hoge$Huga); Code: 0: aload_0 1: invokevirtual #2; //Method java/lang/Object.toString:()Ljava/lang/String; 4: areturn }
この invokevirtual が invokeinterface でも、仕様上は恐らく問題ないだろうということなのです。えええ…!
javac はそういうバイトコードは出力しないけれど、他のコンパイラでどうなっているかは分からないので、invokevirtual の実装は java.lang.Object の virtual method のために、少々面倒なことになっている、という話。
仕様に詳しい方がいたら、どの辺からそういうことがいえるのか、教えていただきたいですね!
おしまい。