← Spring コース
37. アノテーションとリフレクション
@ で始まるは、やに情報を貼り付ける目印です。それ自体は何も実行しません。実行時にクラスの中身を調べる仕組み()を使い、目印の付いたメソッドを探して呼ぶコードを誰かが書いて、初めて意味が生まれます。下のコードでは @RunMe(times = 3) を付けても、直接呼べば1回しか動きません。
TypeScript のデコレータは見た目が似ていますが、こちらは実行時に呼ばれる関数です。また TypeScript の型注釈は出力された JavaScript に残りませんが、Java ではの引数がどのクラスかを実行時に読み取れます。引数の型を見て渡すものを決める、といったコードを追加の設定なしに書けるのは、この違いによります。
注意点が2つあります。目印を実行時に読めるのは、定義に (RUNTIME) を付けたものだけです。付けない場合は には記録されますが、リフレクションからは見えません。もう1つ、Java にも実行時に残らない型の情報があります。ArrayList<String> と ArrayList<Integer> は実行時には同じクラスで、引数の名前も既定では残りません。
点線の付いた語はタップすると説明が出ます。用語集を開く →
Java: @RunMe を付ける情報を貼るだけ。何も実行されない
TypeScript: @Injectable() を付けるデコレータは関数
コンパイル
.class に記録されるRuntimeVisibleAnnotations という欄に入る
出力 JS に呼び出しが入るService = __decorate([Injectable()], Service)
実行時
読む側のコードが探して動作を決めるgetAnnotation で読み、invoke で呼ぶ
関数が呼ばれるdecorator called for: Service と出力された
- ・Java 言語仕様は「An annotation is a marker which associates information with a program element, but has no effect at run time.」と書いています(JLS SE 25 §9.7)
- ・TypeScript 側は typescript 7.0.2 と Node 24.21.0 で、experimentalDecorators を有効にした旧方式のデコレータでの実測です(既定の方式では測っていません)。TypeScript Handbook の Decorators のページは、実験的な旧方式のデコレータの説明だと自ら注記しています
- ・「読む側が意味を与える」は仕様の文言ではなく、下のコードの実行結果を言い換えたものです
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Java
図やコードに出てくる用語(タップで説明)
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗