torutkのブログ

ソフトウェア・エンジニアのブログ

アノテーション情報のクラスファイルへの格納

先月実施した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があります。この属性にアノテーション情報が入っています。