Javaのアノテーション便利すぎワロタwwをしたいので総復習したけどワロエナイ

学校のカリキュラムでC#やってた頃、当時の担任の先生の勧めで始めたjavaですが、お恥ずかしながらアノテーションちゃんとやってなくて、ノリでやってました(笑)書いてあるまんま読んで、なんとなーく「こんなことしてくれてるっぽいなー」程度でした・・・こんなの知らないでやってたのか!!(怒)と思う方もいると思います、自分でも思いました(・∀・)デザインパターンとかやってる場合じゃねぇ!(笑)

フレームワーク使ってWeb開発やってたらノリじゃ自分で書けないし、読む時も時間かかって仕方なくなってきたので、まとめます。C#でいう属性(attribute)ですかね。ざっくり調べた感じ標準で提供されているものはjavaのアノテーションより、c#の属性のほうが充実してる印象です。(どっちも中途半端なんで参考になりませんが)

引用 wikipedia

 1.JavaのアノテーションとC#の属性

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

Java SE 5から登場。クラスやメソッド、パッケージに対してメタデータとして注釈を記入する。実態はjava.lang.Annotationインターフェースを継承したインターフェースで、自作もできる。

アノテーションには3種類ある

  1. データが無く、名前だけのマーカー
  2. データをひとつだけ持ち、メソッド呼び出しに似た、単一アノテーション
  3. 複数のデータをもつフル・アノテーション

 

C#の属性について

クラスやメンバーに追加情報を与えるもの。コンパイラに対する指示を行ったり、クラス利用者に対する情報を残す。属性にはカスタム属性と擬似カスタム属性の2種類ある。擬似カスタム要素とはCLR(Common Language Runtime)が認識できるような属性。コードに属性を記述するとコンパイラはメタデータを生成する。

 

2.とりあえず標準で提供されているものを使ってみる

javaのほう

本当にクソなサンプルコードだな、って書きながら思ったけど、もうめんどくさかった(笑)

上記のコードはJavaが標準で提供しているもの+javadoc用になってます。

java書くなら以下全ての用途を全て覚えておいたほうがいい、と断言できるくらい頻出のものばかりです。俺、@overrideしか覚えてなかったw以下が標準で提供されているものです。

  1. @Override :そのメソッドがスーパークラスのメソッドをオーバーライドしていることを明示的にする。(スーパークラスにないメソッドにつけたりするとエラーが出るようにしてくれたり、ソースコードを読む人にとって、オーバーライドされたメソッドであることが視覚的にわかりやすくなる)
  2. @Deprecated :そのメソッドの仕様が非推奨であることを明示的にするアノテーション。このアノテーションがついたメソッドやクラスを利用すると警告メッセージがコンパイル時に表示されるようになる。(下位互換のために、仕方なく残しているメソッドなどにつけるといいかも)
  3. @SuppressWarning :引数にメッセージを与えると、メッセージによってコンパイル時のエラーを非表示にすることができます。(ゴリ押ししたいときに・・・w)メッセージの参考に

よく使うのはこの3つ。独自アノテーションを定義するために、標準で提供されているものが、これらとは別にありメタアノテーションといいます

  1. @Target :独自に定義したアノテーションが、何を対象に利用できるものか、を宣言するためのアノテーション。例えば@Overrideアノテーションはメソッドが対象で、@SuppressWarningはだいたいのものに、つけることができます。クラスにつけるのか、変数につけるのか、みたいなのをこれで決めます。
  2. @Retention :これ一番ピンと来ないんですが、アノテーションの配置方法を決める、ということらしいです。コンパイル時やプログラム実行時にもアノテーションの情報を保持するかどうか、を定義できる。

以上の5つが、標準で提供されているアノテーションみたいです。

3.一応標準じゃないけど、頻出アノテーション

これ以外にも頻繁に見かけるもの+勉強ついでにJUnitに関するアノテーションをメモっておきます。

Javadoc関連のアノテーション

(Javadocとは、ソースコードに書かれている情報から、自動的にパッケージに関するドキュメントを生成してくれるプログラム。僕は自分自身がjavadocでドキュメントを確認する、ってことは少ないですが、javadoc形式で書かれたコメントなどは、IDEで参照するときに、非常に重宝しているのでjavadocを全く使わない、という方でもjavadocのアノテーションに関して理解し、それに対応したソースコードを書くことは非常に有意義、だと思います。僕が個人的によく見かけると思ってるものから順番に書きます(全部じゃないです))

  1. @author :開発者の名前を記述
  2. @param:引数と引数の概要に関して記述
  3. @return: 戻り値の概要を記述
  4. @exception: メソッドが投げる例外クラスとその概要を記述(@throwsと同義)
  5. @version : クラスやメソッドのバージョンを記述(バージョン管理システムで割り当てを自動にすることも出来る)
  6. @see : 関連する他のクラスやメソッドを記述。わからないことあったら、ここも見てね!って感じ
  7. @deprecated : java標準の@Deprecatedと同様に非推奨のクラスやメソッドを明示する。

他にももうちょいあるけど、よく見るのはこんな感じ

こんな感じで使えます。javadocでつくられた公式APIリファレンスはこちら

 

JUnit関連のアノテーション

  1. @Test :メソッドがテストメソッドであることを示す。
  2. @Before : @Testアノテーションがついたメソッドを実行する前に実行されるメソッドにつける
  3. @After : @Testアノテーションがついたメソッドを実行する後に実行するメソッドにつける
  4. @BeforeClass : テストクラスを呼び出す前に実行されるメソッドにつける
  5. @AfterClass : テストクラスを呼び出した後に実行されるメソッドにつける

わかりやすくていいですね。簡単に覚えられた。

 

4.自分でアノテーションを定義する

ここまで長々とダラダラ書いてきましたが、結局のところ、一番よく見かけるのはフレームワークや、外部パッケージで定義された、独自のアノテーションかもしれません。フレームワークもパッケージも山ほどあるので、それらを全てここに書けるわけもなく・・・

「よくわからないアノテーションが出てきたときに、それが何をしているか、理解したい」です、とりあえず。(リファレンスに書いてるから、そっかー!じゃなくて、処理を含めて)

4-1.アノテーションの定義

これでアノテーション自体はできあがり。マーカーアノテーションというやつで、意味を付加するだけなので、メンバーは持ちません。

4-2.アノテーションを処理する

参考URL

どういう処理させたらいいか、考えて、参考URLのものとまったく同じじゃつまらないし・・・ということで、任意のアノテーションを取得して、まぁその後は好きに処理させたらおっけー、ということで、一覧に出すプログラム書きました。クラスそのもの、メソッド、フィールドを例に出していますが、同じ方法で、全てのElementTypeにアクセスできます。

 

 

上記の2つのクラスと1つの独自アノテーションを使って処理

ごめん、正直力尽きたwwww

良いサンプルを作るって大変ですな・・・とりあえず扱い方(自分で定義する方法と、それに対応した処理を実装するとこ)は把握できたので、ここまで・・・。

より有効な使い方などは直接既存フレームワークのソースを読むことをおすすめしますw

まぁこんな感じでいける、ということだけでも伝われば・・・(笑

アノテーション便利なのはよーくわかったけど、ワロタwwwwはできませんね、今のところ・・・w

今回、アノテーションに関して調べて、副産物的に勉強になったのは

  1. クラスリテラルに関して(ClassName.class)
  2. Classクラスに関して (public final class Class)
  3. リフレクション

ですね。いろいろ使えそう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です