LoginSignup
5
5

More than 5 years have passed since last update.

インナークラスのシグネチャを取得する

Last updated at Posted at 2014-09-17

概要

インナークラスは、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のシグネチャを取得するためには?

  1. $を.に置き換える
  2. .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のインスタンスは必要なかった!

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5