概要
インナークラスは、Outer\$Inner.classといった形で「\$」で繋げられるらしい。
javapコマンドを使ってインナークラスのシグネチャを取得しようとして困った。
javapしてみたらアウタークラスのシグネチャじゃん!
ってことで。
単純にjavapしてみた結果
OuterClass
$ javap -s OuterClass.class
Compiled from "OuterClass.java"
public class jp.sample.OuterClass {
public jp.sample.OuterClass();
Signature: ()V
}
InnerClass
$ javap -s OuterClass$InnerClass.class
Compiled from "OuterClass.java"
public class jp.sample.OuterClass {
public jp.sample.OuterClass();
Signature: ()V
}
指定している.classファイルは異なるのに出力結果は同じだったorz
InnerClassのシグネチャを取得するためには?
- $を.に置き換える
- .classを削除する
$ javap -s OuterClass.InnerClass
Warning: Binary file OuterClass.InnerClass contains jp.sample.OuterClass$InnerClass
Compiled from "OuterClass.java"
public class jp.sample.OuterClass$InnerClass {
final jp.sample.OuterClass this$0;
Signature: Ljp/sample/OuterClass;
public jp.sample.OuterClass$InnerClass(jp.sample.OuterClass);
Signature: (Ljp/sample/OuterClass;)V
}
コンストラクタにはOuterClassのインスタンスが必要なのがわかる。
上記はstatic classじゃないので実際にjavaで外部から仕様する際は、
OuterClassのインスタンスが必要になるからだろう。
まとめ
- javapする際に.classは不要だった。
- $を.に置き換えれて、.classを削除すれば、インナークラスのシグネチャも取得できる。
おまけ
インナークラスのインナークラス
$ javap -s OuterClass.InnerClass.InnerInnerClass
Warning: Binary file OuterClass.InnerClass.InnerInnerClass contains jp.sample.OuterClass$InnerClass$InnerInnerClass
Compiled from "OuterClass.java"
public class jp.sample.OuterClass$InnerClass$InnerInnerClass {
final jp.sample.OuterClass$InnerClass this$1;
Signature: Ljp/sample/OuterClass$InnerClass;
public jp.sample.OuterClass$InnerClass$InnerInnerClass(jp.sample.OuterClass$InnerClass);
Signature: (Ljp/sample/OuterClass$InnerClass;)V
}
ちゃんと取得できた。
スタティックなインナークラス
$ javap -s OuterClass.StaticInnerClass
Warning: Binary file OuterClass.StaticInnerClass contains jp.sample.OuterClass$StaticInnerClass
Compiled from "OuterClass.java"
public class jp.sample.OuterClass$StaticInnerClass {
public jp.sample.OuterClass$StaticInnerClass();
Signature: ()V
}
コンストラクタでOuterClassのインスタンスは必要なかった!