Java リフレクションのアノテーション

大家讲道理
リリース: 2017-05-28 11:35:24
オリジナル
1311 人が閲覧しました

アノテーション」という単語はJavaプログラミングにおいて出現率が高いと言え、よく話題にもなります。以前 Spring 関連のことについて話していたとき、注釈はいたるところにありました。以前、Spring で「注釈」がどのように組み合わされるかなど、いくつかの「注釈」関連の内容について簡単に説明しました。アノテーションは Java プログラミングにおいて依然として比較的重要であるため、今日のブログでは、もちろん、具体的な例に基づいてアノテーションを体系的に紹介します。

端的に言えば、「アノテーション」はデータを保存するための手段です。「アノテーション」とJavaの「リフレクション機構」を組み合わせると、その機能は平均的です。 。言い換えれば、「アノテーション」によって提供される情報をリフレクションを通じて読み取り、特定のニーズに応じて何かを行うことができます。もちろん、以前は反映メカニズムの情報を提供するために XML を使用していましたが、「XML」の構成はまだ「アノテーション」のデータ形式ほど管理および保守が簡単ではないため、「アノテーション」の状態は変わりました。 」は依然として比較的重要です。

以下では、まず「メタアノテーション」について説明し、次にこれらの「メタアノテーション」に基づいてアノテーションをカスタマイズし、Java の「リフレクションメカニズム」を使用してさまざまなタイプのアノテーション情報を読み取ります。

1. メタアノテーション

このブログの最初の部分では、まず 「メタアノテーション」 について全体的に見ていき、その後、これらに基づいて以下の内容を展開していきます。メタアノテーション。

1. @Target

使用法: @Target(ElementType.CONSTRUCTOR)

@Target アノテーション重要 はい、ターゲットは中国語で「 「目標、場所」の意味はその名前でわかります。 @Target は、作成したアノテーションの場所、つまり、作成したアノテーションがどのような種類の要素を変更できるかを宣言するために使用されます。 @Target のパラメーターは ElementType の列挙であり、各列挙項目は位置を表します。以下は、ElementType 列挙のより一般的に使用される値の一部です:

  • TYPE: クラス、@Target のパラメーターが TYPE の場合、作成するアノテーションはクラス、インターフェース、列挙のみを変更できます。 、など優れています。
  • FIELD: フィールドの変更。カスタム アノテーションが FIELD 型の場合、アノテーションはクラスまたは列挙のフィールド、つまりメンバー 変数 を変更するためにのみ使用できます。
  • CONSTRUCTOR: コンストラクター型。この型の「アノテーション」はコンストラクターのみを変更できます。
  • METHOD: 「メソッド」を変更する注釈。
  • PARAMETER: 「メソッド」内のパラメータを変更するアノテーション。
  • LOCAL_VARIABLE: 「ローカル変数」のアノテーションを変更します。

もちろん、上記は簡単な説明であり、上記の種類のアノテーションの具体例を以下に示します。以下のスクリーンショットは、ElementType のすべてのオプションと各列挙値の役割を示しています。詳細は以下の2つが1.8以降に新たに追加された列挙項目です。

RUN

TIME)

上記は

@Retention
の使い方です。Retentionの中国語の意味は「
retention

」であり、メタアノテーションが「アノテーション」の保持を与えることを意味します。期間。 @Retention は列挙型のパラメータも受け取ります。以下は列挙型に含まれる型です。以下の英語のコメントは、各列挙項目の意味を具体的に示しています。

  • ソース: 注釈はソース コード内にのみ残り、コンパイルされないことを意味します。
  • CLASS: アノテーションはバイトコードにコンパイルされ、.class ファイルに保存されますが、仮想マシンではリンクされず、実行されないことを意味します。
  • RUNTIME: これは、注釈がプログラムの実行時まで保持されることを意味します。実行時に注釈情報に基づいてリフレクション メカニズムを通じて何かを実行したい場合、注釈はこの段階まで保持される必要があります。 。

3、@

Document

と@Inheritedこれらの2つのアノテーションは比較的単純で、@Documentはこのアノテーションが

Javadoc

に含まれていることを示します、そして @Inherited は、このアノテーションがサブクラスによって継承できることを意味します。 上記の紹介は少し抽象的かもしれません。次に、例に基づいて、リフレクション メカニズムを使用して、対応するタイプのカスタム アノテーションを操作します。

2. テストケースの紹介

以下のスクリーンショットは、このブログに関係するデモのディレクトリと主な操作カテゴリです。

AnnotationTracker
    : このクラスは、Java の「リフレクション メカニズム」を通じて、対応するタイプの注釈の
  • オブジェクト
    と注釈内の関連情報を取得する責任があります。 AnnotationTracker クラスには、すべての static メソッドがあり、静的メソッドは関連するアノテーションが変更されたクラスに渡されます。一般的な構造は次のとおりです。 CE…
    Annotation
  • : これらのクラスはさまざまなタイプのアノテーションであり、後で詳しく説明します。
  • TestClass
  • : このクラスは、アノテーションによって変更されたテストクラスです。
  • Main
  • : このデモのテストケースの実行メソッド。

3. 型アノテーション:

@Target(ElementType.

TYPE) 次に、型アノテーションの作成と使用方法を見てみましょう。 。以下のコンテンツでは、変更タイプのアノテーションを作成し、次にそのアノテーションの変更を関連するクラスに追加し、最後に Java のリフレクション機構を使用して、対応するアノテーション情報を取得します。

1. 注釈を作成します

まず、注釈を作成します。具体的な手順は次のとおりです。次に、注釈名を入力して Enter をクリックします。

以下のコードスニペットは、作成されたアノテーションの詳細な内容です。

@Target メタアノテーションのパラメーターの型が

ElementType.TYPE

であることがわかります。これは、作成したアノテーションが変更タイプのアノテーションであることを意味します。これは、スコープ指定されたクラス、インターフェイス、列挙型、その他の型にすることができます。次に、

@Retention

のパラメーターの型が RetentionPolicy.RUNTIME であることもわかり、アノテーションが実行時まで保持されることを示しています。 アノテーションは、インターフェースと同様の @Interface を使用して宣言されます。 @Interface の後にアノテーションの名前が続きます。このアノテーションの名前は

CETypeAnnotation

です。 public integer(int) type idattribute があります。以下に示すように、この属性のデフォルト値は 0 です。

2. アノテーションの使用

以下のコード スニペットは、上記の注釈を使用したものです。上記で作成したアノテーションは ElementType.TYPE 型であるため、このアノテーションを使用して、作成したクラス (以下の TestClass) を変更します。変更に注釈を付けるときは、id の値を設定します。以下の id = 10 です。

3. リフレクションを使用して、変更された型のアノテーションに関する関連情報を取得します

次に、Javaの「リフレクション機構」をAnnotationTrackerクラスに追加して、対応するTestClass クラスのアノテーションの関連情報が提供されます。キーコードは次のとおりです。 trackTypeAnnotation() メソッドのパラメータは Class 型であり、対応するクラスの注釈オブジェクトは Class の getAnnotation() メソッドを通じて取得できます。下の赤枠内に示すとおりです。

対応するアノテーションオブジェクトを取得した後、対応するアノテーション内の構成情報を取得できます。

4. テストケースとテスト結果

次に、以下に示すように、Main メソッドの AnnotationTracker クラスで上記のメソッドを呼び出し、TestClass に渡します。以下はそれをプリントアウトしたものです。

IV. 他のタイプのアノテーション

ElementType.TYPE タイプのアノテーションについては上で詳しく説明しました。これらの注釈の使い方。

1, @Target(ElementType.CONSTRUCTOR)

次に、コンストラクターを装飾するアノテーションを作成しましょう。以下の CEConstructorAnnotation は、クラス コンストラクターを変更するために作成したアノテーションです。値フィールドのデフォルト値は空の string です。

2, @Target(ElementType.FIELD)

次に、フィールドに特定の CEFieldAnnotation という名前を付けます。コード 示されているとおり以下:

3、

@ターゲット(elementType.method)

は、作成した変更方法の注釈です。を以下に示します。

4, @Target(ElementType.

PARAMETER)

以下は、変更されたメソッドのパラメータのアノテーションであり、次のように名前を付けました。

5. 前述の関連アノテーションの使用

以下は、上で定義されたさまざまなタイプのアノテーションの使用方法であり、それぞれが独自の役割を果たします。あまり詳しくは説明しません。

6. リフレクションメカニズムを使用して、さまざまなタイプのアノテーション情報を取得します

以下では、「Java」のリフレクションメカニズムを使用して関連するアノテーション情報を取得する方法について説明しました。上記の種類の注釈のそれぞれに関連する情報を取得します。以下のコードは主に AnnotationTracker の関連コードです。

1. 変更したコンストラクター型のアノテーション情報を取得します

2. 変更されたメソッドとメソッドパラメータのアノテーション情報を取得します

3. 変更されたフィールドのアノテーション情報を取得します

4.テストケースと出力


以上がJava リフレクションのアノテーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート