98

注釈がJavaで内部的にどのように機能するかを誰かに説明できますか?

Java で java.lang.annotation ライブラリを使用してカスタム注釈を作成する方法を知っています。しかし、 @Override アノテーションなど、内部でどのように機能しているかはまだわかりません。

どなたか詳しく教えていただけるとありがたいです。

4

6 に答える 6

145

アノテーションの種類間の最初の主な違いは、それらがコンパイル時に使用されてから破棄されるか ( のように@Override)、コンパイルされたクラス ファイルに配置されて実行時に利用可能になるか (Spring の のように@Component) です。これは、アノテーションの@Retentionポリシーによって決定されます。独自の注釈を作成している場合、その注釈が実行時に役立つか (おそらく自動構成用)、またはコンパイル時にのみ役立つか (チェックまたはコード生成用) を決定する必要があります。

注釈を使用してコードをコンパイルする場合、コンパイラは、アクセス修飾子 ( public/ private) やfinal. 注釈に遭遇すると、注釈プロセッサを実行します。これは、特定の注釈に関心があることを示すプラグイン クラスのようなものです。アノテーション プロセッサは通常、Reflection API を使用してコンパイル中の要素を検査し、単純にチェックを実行したり、要素を変更したり、コンパイルする新しいコードを生成したりします。@Override最初の例です。Reflection API を使用して、スーパークラスの 1 つでメソッド シグネチャに一致するものを見つけられるようにし、一致しMessagerない場合は を使用してコンパイル エラーを発生させます。

注釈プロセッサの作成に関するチュートリアルは多数あります。ここに便利なものがあります。コンパイラが注釈プロセッサを呼び出す方法については、Processorインターフェイスのメソッドを調べてください。主な操作はprocessメソッドで行われ、コンパイラが一致する注釈を持つ要素を検出するたびに呼び出されます。

于 2013-08-13T07:01:35.873 に答える
6

ここにあります@Overridehttp://www.docjar.com/html/api/java/lang/Override.java.html

自分で書いた注釈と区別する特別なことは何もありません。興味深い部分は、アノテーションのコンシューマーにあります。のような注釈の場合@Override、それは Java コンパイラ自体、静的コード分析ツール、または IDE にあります。

于 2013-08-12T14:47:36.850 に答える
3

このリンクに従ってください。これにより、問題に対する適切な答えが得られます。で注釈に注目するとJava、注釈は Java 5 で導入されたものであり、Spring 固有のものではありません。一般に、注釈を使用すると、メタデータをクラス、メソッド、または変数に追加できます。アノテーションは、コンパイラー (@Override アノテーションなど) または spring などのフレームワーク (@Component アノテーションなど) によって解釈できます。

さらに、私はより多くの参照を追加しています。

  1. http://www.codeproject.com/Articles/272736/Understanding-Annotations-in-Java
  2. http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/package-summary.html
  3. http://www.coderanch.com/how-to/java/AnnotationsExample
于 2013-08-12T14:47:59.027 に答える
3

基本的に、注釈はコンパイラまたはアプリケーションによって読み取られる単なるマーカーです。保持ポリシーに応じて、コンパイル時にのみ使用できるか、リフレクションを使用して実行時に読み取り可能になります。

多くのフレームワークは実行時保持を使用します。つまり、クラス、メソッド、フィールドなどに注釈が存在するかどうかを反射的にチェックし、注釈が存在する (または存在しない) 場合に何かを行います。さらに、注釈のメンバーを使用して、さらに情報を渡すことができます。

于 2013-08-12T14:52:59.813 に答える