ホームページ  >  記事  >  Java  >  Java のアノテーションとは何か、およびその原理の詳細な紹介

Java のアノテーションとは何か、およびその原理の詳細な紹介

高洛峰
高洛峰オリジナル
2017-01-23 15:29:041435ブラウズ

アノテーションとは何ですか?

アノテーションは、一般的な @Override や @Deprecated など、メタデータとも呼ばれます。アノテーションは、コードを説明するために使用されます。クラス、インターフェイス、フィールド、メソッドのパラメータ、ローカル変数などに注釈が付けられます。その主な機能は次のとおりです:

ドキュメントを生成し、コード内で識別されたメタデータを通じて javadoc ドキュメントを生成します。

コンパイル チェック。コード内で識別されるメタデータを通じて、コンパイラーはコンパイル中にチェックおよび検証できます。

コンパイル時の動的処理。動的にコードを生成するなど、コード内で識別されたメタデータによるコンパイル時の動的処理。

実行時の動的処理。リフレクションインジェクションインスタンスの使用など、コード内で識別されるメタデータによる実行時の動的処理。

一般的なアノテーションは 3 つのカテゴリに分類できます:

最初のカテゴリは、@Override、@Deprecated、@SuppressWarnings などの Java に付属する標準アノテーションで、メソッドのオーバーライドを示すために使用され、特定のクラスまたはメソッドが古いため、警告を無視するようにマークします。コンパイラは、警告をこれらのアノテーションでマークした後でチェックします。

最初のカテゴリはメタアノテーションです。メタアノテーションは、@Retention、@Target、@Inherited、@Documented などのアノテーションを定義するために使用されます。 @Target はアノテーションの使用を示すために使用され、@Inherited はアノテーションが継承できることを示すために使用され、@Documented は javadoc ドキュメントを生成するかどうかを示すために使用されます。

最初のタイプはカスタム アノテーションです。独自のニーズに応じてアノテーションを定義でき、カスタム アノテーションにメタ アノテーションを付けることができます。

アノテーションの原則:

大規模な Java システムでアノテーションがどのようにサポートされるかを見てください。上記のカスタム アノテーションの例に戻りましょう。次のように、AnnotationTest クラスにアノテーションが付けられている場合、アノテーション宣言の値は AnnotationTest.class.getAnnotation(Test.class) を通じて取得できます。上記の文を見ると、クラス構造から Test アノテーションを取得していることがわかります。そのため、ある時点でアノテーションがクラス構造に追加されているはずです。

@Test("test")
public class AnnotationTest {
public void test(){
}
}

Java ソース コードからクラス バイトコードへの変換はコンパイラによって行われ、コンパイラによって Java ソース コードが解析され、アノテーション シンボルが追加されます。クラス構造 JVM 仕様によれば、クラス ファイル構造は厳密に順序付けられた形式になっており、クラス構造に情報を追加する唯一の方法は、クラス構造の属性に保存することです。クラス、フィールド、およびメソッドには、クラス構造内に独自のテーブル構造があり、それぞれに独自の属性があることがわかります。また、アノテーションの場合、それらのアクションの範囲は、クラスまたはフィールドに対して異なる場合があります。またはメソッドを使用すると、コンパイラはクラス、フィールド、またはメソッドのプロパティにアノテーション情報を保存します。

AnnotationTest クラスがコンパイルされると、対応する AnnotationTest.class ファイルに RuntimeVisibleAnnotations 属性が含まれるようになります。このアノテーションはクラスに適用されるため、この属性はクラスの属性セットに追加されます。つまり、Test アノテーションのキーと値のペア value=test が記録されます。 JVM が AnnotationTest.class ファイルのバイトコードをロードすると、RuntimeVisibleAnnotations 属性値が AnnotationTest の Class オブジェクトに保存されるため、Test アノテーション オブジェクトは AnnotationTest.class.getAnnotation(Test.class) を通じて取得でき、次に The Test を通じて取得できます。アノテーションオブジェクトはTestで属性値を取得します。

ここで質問があるかもしれませんが、Test アノテーション オブジェクトとは何ですか?実際、コンパイルされたアノテーションの本質は Annotation インターフェイスを継承するインターフェイスであるため、@Test は実際には「パブリック インターフェイス Test extends Annotation」になります。これを AnnotationTest.class.getAnnotation(Test.class) を通じて呼び出すと、JDK は次のようになります。動的プロキシを通じて生成する Test インターフェイスを実装し、このオブジェクトに RuntimeVisibleAnnotations 属性値を設定するオブジェクト。このオブジェクトは Test アノテーション オブジェクトであり、その value() メソッドを通じてアノテーション値を取得できます。

Java アノテーション実装メカニズムの全体プロセスは上に示したとおりであり、その実装にはコンパイラーと JVM の連携が必要です。

読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトをサポートしていただきありがとうございます!

アノテーションとは何か、その原則に関する Java 記事をさらに知りたい場合は、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。