ホームページ >Java >&#&チュートリアル >Java のアノテーションとは何か、およびその原理の詳細な紹介
アノテーションとは何ですか?
アノテーションは、一般的な @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 サイトに注目してください。