先月実施したJava読書会での宿題の残りの調査。
アノテーションを付けた要素はどうクラスファイルに格納されるかを調べました。
javapコマンドによるクラスファイル解析
まず、javapコマンドで-verboseオプションをつけてクラスを解析します。
$ javap -verbose AnnotatedTest Compiled from "AnnotatedTest.java" public class AnnotatedTest extends java.lang.Object SourceFile: "AnnotatedTest.java" minor version: 0 major version: 50
クラス情報が最初に表示されます。続いて、コンスタント・プール情報が表示されます。
Constant pool: const #1 = Method #3.#14; // java/lang/Object."":()V const #2 = class #15; // AnnotatedTest const #3 = class #16; // java/lang/Object const #4 = Asciz ; const #5 = Asciz ()V; const #6 = Asciz Code; const #7 = Asciz LineNumberTable; const #8 = Asciz depre; const #9 = Asciz Deprecated; const #10 = Asciz RuntimeVisibleAnnotations; const #11 = Asciz Ljava/lang/Deprecated;; const #12 = Asciz SourceFile; const #13 = Asciz AnnotatedTest.java; const #14 = NameAndType #4:#5;// " ":()V const #15 = Asciz AnnotatedTest; const #16 = Asciz java/lang/Object;
続いて、メソッド情報が表示されます。
{ public AnnotatedTest(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return LineNumberTable: line 1: 0
ソースコードにコンストラクタを記述していない場合、デフォルトコンストラクタが生成されます。
public void depre(); Code: Stack=1, Locals=2, Args_size=1 0: sipush 4660 3: istore_1 4: return LineNumberTable: line 5: 0 line 6: 4 Deprecated: true RuntimeVisibleAnnotations: length = 0x6 00 01 00 0B 00 00 }
次にアノテーション@Deprecatedを付与したメソッドdepreです。
メソッドの属性情報として、RuntimeVisibleAnnotationsがあります。この属性にアノテーション情報が入っています。