interprism's blog

インタープリズム株式会社の開発者ブログです。

Javaのアノテーションについて

こんにちは、imamotoです。

私は入社4年目で、今まではほとんどPHPで開発する案件に参画していましたが、今年の1月から新たにJavaの案件に参画しています。

そちらの現場では週1回、開発メンバーでホスト持ち回りでJavaの勉強会を行っていて、先日私もJavaアノテーションについてプレゼンを行いました。

Javaとガッツリ向き合うのはほぼ入社時の研修以来で、アノテーションについても細かいことはあまり知らず、基本的なことから改めて勉強する良い機会となりました。

せっかく資料も作ったのでその時発表した内容をこのブログにも書いてみようと思います。

プレゼン資料(改)

アノテーションとは

アノテーション とは「注釈」を意味し、クラスやメソッド、パッケージに対して付加情報を記入する機能です。

Java SE 5で追加され、以下のコードのように「@ + アノテーション名」という形式で使用します。

アノテーションとは

アノテーションの分類

アノテーションが持つデータの数による分類

  1. マーカー・アノテーション
  2. 単一値アノテーション
  3. フル・アノテーション

その他の分類

アノテーションの定義方法

以下のコードのようにアノテーションを定義することができます。

アノテーションの定義方法

アノテーションの使い方

アノテーションは以下のように使うことができます。

アノテーションの使い方

  • 値の指定は" @アノテーション名(キー名=値) "という形で行う
  • デフォルト値が指定されている場合、値の指定は省略できる
  • 単一値アノテーションで値のキー名が value の場合のみ、キー名を省略できる

コンパイル時に処理を行うアノテーションを自作してみる

自作アノテーション概要

以下のようなアノテーションをプレゼン用に自作してみました。

コンパイル時に処理を行うアノテーションの作り方をざっくり紹介

  1. javax.annotation.processing.AbstractProcessorを継承したToDoProcessorクラス作成
  2. public boolean process(Set<? extends TypeElement> typeElements, RoundEnvironment roundEnv)を実装
  3. javac -processor Processorクラスの完全修飾名 コンパイル対象.java で、コンパイル時にprocessメソッドが実行される

コード紹介

ToDoアノテーション

  • messageは必須
  • expirationはStringで、日付を8桁で指定
    • デフォルト値は "19700101"

ToDoProcessorクラス(コンパイル時の処理を記述)

ToDoアノテーション使用クラス

Processorクラスの処理を行わせるためのコマンド

$ javac todo/ToDo.java
$ javac todo/ToDoProcessor.java
$ javac -processor todo.ToDoProcessor todo/ToDoTest.java

出力内容

$ javac -processor todo.ToDoProcessor todo/ToDoTest.java
警告: @ToDo at over5characters(java.lang.String) : if文が不要なので1行にまとめる
todo/ToDoTest.java:6: エラー: ToDoの対応期限が切れています。対応期限2016-02-11
    public static boolean over5characters(String target) {
                          ^
エラー1個
警告1個
  • -processor オプションを使ってコンパイルを行う
  • 普通はProcessorクラスを含むjarを作成してクラスパスに追加する
    • META-INF/services/javax.annotation.processing.Processor というファイルにProcessorクラス名を記載する

まとめ

今回のプレゼンを通して、普段深く考えずに当たり前のように使っているアノテーションについてちゃんと知る良い機会となりました。

また、定義方法やコンパイル時の処理追加方法は意外とシンプルで覚えやすいと感じました。

@ToDoアノテーションは我ながら恐ろしいコードを書いてしまったと感じていますが、放置されたTODOコメントに悩まされている方は是非使ってみてください!!!

最後にgithubのurlを貼っておきますので、コンパイルしてみたい方はcloneして試してみてください。

GitHub - ip-imamoto/annotation-study

それではまた!

PAGE TOP