Java 5.0バージョンで注釈が導入されて以来、Javaプラットフォームの非常に重要な部分になりました。開発プロセス中に、@Overrideや @deprecatedなどの注釈がアプリケーションコードでよく表示されます。この記事では、注釈が何であるか、なぜ紹介すべきか、注釈がどのように機能するか、カスタムアノテーションの作成方法(例を介して)、および最新の注釈とADF(アプリケーション開発フレームワーク)を使用できる状況で説明します。少し時間がかかるので、一杯のコーヒーを用意して、注釈の世界に入りましょう。
注釈とは何ですか?
1つの単語は、注釈、つまりメタデータ、つまりデータを説明するデータを説明できます。したがって、注釈はソースコードのメタデータであると言えます。たとえば、次のコード:
@OverridePublic String toString(){return "これは現在のオブジェクトの文字列表現です。";}上記のコードでは、toString()メソッドを書き直し、@Overrideアノテーションを使用します。ただし、@Override Annotationを使用してコードをマークしなくても、プログラムは正常に実行できます。それで、注釈はどういう意味ですか?このように書くことに何か利点はありますか?実際、@Overrideは、この方法が書き換え方法であることをコンパイラに伝えます(メソッドを説明するメタデータ)。メソッドが親クラスに存在しない場合、コンパイラはエラーを報告し、メソッドが親クラスのメソッドを書き換えないことを促します。たとえば、間違ったタイプミスを誤って綴った場合、toString()をtoString(){double r}として書き込み、@Overrideアノテーションを使用しない場合でも、プログラムをコンパイルして実行できます。しかし、操作の結果は、私が期待したものとは大きく異なります。今、私たちは注釈が何であるかを理解し、注釈を使用するとプログラムの読み取りに役立ちます。
注釈は、クラス、方法、パラメーター、変数、コンストラクター、パッケージ宣言に適用される特別な修飾子です。これは、メタデータを記述するためにJSR-175標準によって選択されたツールです。
なぜ注釈を紹介するのですか?
XMLは、メタデータを記述するために広く使用されています。一部のアプリケーション開発者と建築家は、XMLのメンテナンスが悪化していることを発見し始めています。彼らは、XMLのようなコード(および場合によっては完全に分離さえ)にゆるく結合されるコードの説明ではなく、コードにしっかりと結合したものを使用したいと考えています。 Googleで「XML vs. Annotations」を検索すると、この問題に関する多くの議論が表示されます。最も興味深いのは、XML構成が実際に個別のコードと構成に導入されることです。上記の2つのビューはあなたを混乱させるかもしれません。どちらのビューもサイクルを形成しているようですが、それぞれに長所と短所があります。例を使用して、2つの違いを理解しましょう。
アプリケーションに多くの定数またはパラメーターを設定する場合、XMLは特定のコードに接続されないため、この場合は適切です。メソッドをサービスとして宣言したい場合は、この場合、注釈とメソッドをしっかりと結合する必要があり、開発者がこれを認識する必要があるため、注釈を使用する方が良いでしょう。
もう1つの重要な要素は、注釈がメタデータを記述する標準的な方法を定義することです。この前に、開発者は通常、メタデータを独自の方法で定義します。たとえば、タグ付きインターフェイス、注釈、一時的なキーワードなどを使用します。各プログラマーは、注釈の標準的な方法とは異なり、メタデータを独自の方法で定義します。
現在、多くのフレームワークは、XMLと注釈を組み合わせて使用して、2つの間の長所と短所のバランスをとっています。
注釈はどのように機能しますか?カスタム注釈を書く方法は?
この部分を伝える前に、最初にアノテーションサンプルコードAnnotationsSample.zipをダウンロードすることをお勧めします。ダウンロードした後、使用することに慣れているIDEに入れてください。これらのコードは、注釈メカニズムをよりよく理解するのに役立ちます。
注釈を書くことは非常に簡単です。注釈の定義をインターフェイスの定義と比較できます。 2つの例を見てみましょう。1つは標準のAnnotation @Overrideで、もう1つはユーザー定義のAnnotation @Todoです。
@target(elementType.Method)@retention(RetentionPolicy.Source)public @interface Override {}@overrideアノテーションについて質問があるかもしれませんが、何もしません。親クラスに同じ名前の関数があることをどのように確認しますか?もちろん、驚かないでください、私はあなたをからかっているだけです。 @Overrideアノテーションの定義は、その小さなコードだけではありません。コンテンツのこの部分は非常に重要です。もう一度繰り返す必要があります。注釈はメタデータであり、ビジネスロジックとは何の関係もありません。理解するのは少し難しいですが、それだけです。注釈にビジネスロジックが含まれていない場合、誰かがそれらを実装する必要があります。メタデータユーザーはこれを行います。注釈は、定義するプロパティに関する情報のみを提供します(クラス/メソッド/パッケージ/ドメイン)。 Annotationsのユーザー(繰り返しますが、一部のコード)はこの情報を読み、必要なロジックを実装します。
Javaの注釈(@Overrideなど)を使用する場合、JVMはバイトコードレベルで動作するユーザーです。この時点で、アプリケーション開発者はカスタム注釈を制御または使用できません。それでは、カスタムアノテーションを書く方法を説明しましょう。
カスタムアノテーションを1つずつ執筆する重要なポイントについて話しましょう。上記の例では、注釈にいくつかの注釈が適用されています。
J2SE5.0バージョンは、java.lang.Annotationで4種類のメタアノテーションを提供します。
@documented javaドキュメントに注釈情報が追加されるかどうかを示す簡単なアノテーションタグアノテーション。
@retentionは、この注釈のライフサイクルを定義します。
RetentionPolicy.Sourceは、編集段階で破棄されます。これらの注釈は、コンピレーション後にもはや意味がないため、bytecodeを書きません。 @Override、@suppresswarningsはすべて、このタイプの注釈に属します。
retentionPolicy.classは、クラスがロードされると破棄されます。 ByteCodeファイルの処理に役立ちます。これは、注釈のデフォルトの方法です。
RetentionPolicy.runtimeは廃棄されることはなく、アノテーションは実行時間中に保持されるため、注釈の情報は反射メカニズムを使用して読むことができます。通常、カスタムアノテーションはこの方法で使用されます。
@Targetは、この注釈がどこで使用されるかを示します。指定されていない場合、注釈はどこにでも配置できます。利用可能なパラメーターの一部を以下に示します。属性の注釈が互換性があることに注意する必要があります。 7つの属性すべてに注釈を追加し、1つの属性のみを除外する場合は、すべての属性を含めるためにターゲットを定義する必要があります。
@Inheritedは、この注釈とサブクラスの関係を定義します
それでは、注釈の内部定義はどうですか?注釈は、基本的なタイプ、文字列、列挙の種類のみをサポートします。コメント内のすべての属性はメソッドとして定義され、デフォルト値が提供されます。
@target(elementtype.method)@retention(retentionpolicy.runtime)@interface {public enum priority {low、medium、high} public enum status {started、not_started} string著者次の例は、上記の注釈を使用する方法を示しています。
@todo(priority = todo.priority.medium、著者= "yashwant"、status = todo.status.started)public void incompletemethod1(){//いくつかのビジネスロジックは//まだ完全ではありません}アノテーションに属性が1つしかない場合、それは直接「値」と命名することができ、それを使用するときに属性名を示す必要はありません。
@interface著者{string値();}@著者( "yashwant")public void somemethod(){}しかし、これまでのところ、すべてがかなり良さそうです。独自の注釈を定義し、ビジネスロジックメソッドに適用します。次に、注釈を呼び出すためにユーザープログラムを作成する必要があります。ここでは、反射メカニズムを使用する必要があります。リフレクションコードに精通している場合、リフレクションがクラス名、方法、インスタンス変数オブジェクトを提供できることがわかります。これらのすべてのオブジェクトには、注釈情報を返すgetAnnotation()メソッドがあります。このオブジェクトをカスタムコメントに変換する必要があります(instanceof()で確認した後)。また、カスタムコメントのメソッドを呼び出すこともできます。上記の注釈を使用して、次の例コードをご覧ください。
class businesslogicclass = businesslogic.class; for(method method:businesslogicclass.getmethods()){todo todoannotation =(todo)method.getannotation(todo.class); if(todoannotation!= null){system.out.out.println( "method name:" + methodname: " todoannotation.author()); system.out.println( "priority:" + todoannotation.priority()); system.out.println( "status:" + todoannotation.status();}}}注釈のユースケース
注釈の機能は非常に強力であり、スプリングやヒーバーネートなどのフレームワークは、伐採と有効性で注釈を使用します。マーカーインターフェイスが使用される場合は、注釈を適用できます。違いは、タグインターフェイスが完全なクラスを定義するために使用されることですが、メソッドをサービスとして公開するかどうかなど、単一のメソッドのコメントを定義できます。
最新のサーブレット3.0、特にサーブレットセキュリティに関連する新しい注釈が導入されています。
Handlestypesこの注釈は、ServletContainerInitializerに渡されたアプリケーションクラスのセットを表すために使用されます。
httpconstraintこのアノテーションは、すべてのHTTPメソッドのアプリケーション要求のセキュリティ制約を表し、Servletsecurity Annotationで定義されたHTTPMethodConstraintセキュリティ制約とは異なります。
httpmethodconstraintさまざまなタイプのリクエストのセキュリティ制約を指定します。これは、サーブレットセキュリティアノテーションのHTTPプロトコルメソッドタイプを記述する注釈とは異なります。
MultiPartConfigこの注釈はサーブレットにマークされており、サーブレットが処理したい要求のMIMEタイプがMultiPart/Form-Dataであることを示しています。
Servletsecurity注釈は、サーブレット継承クラスにマークされ、HTTPプロトコル要求はセキュリティの制約に準拠することを余儀なくされます。
WebFilterは、サーバーフィルターを宣言するために使用されます。
WebInitParamこの注釈は、サーブレットまたはフィルターの初期化パラメーターを宣言するために使用され、通常@Webservletまたは@WebFilterで使用されます。
Weblistenerこのアノテーションは、Webアプリケーションのコンテキストにおけるイベント宣言リスナーの異なるタイプのタイプです。
WebServletこの注釈は、サーブレットの構成を宣言するために使用されます。
ADF(アプリケーションフレームワーク)および注釈
次に、記事の最後の部分について議論し始めます。 ADFとして知られるアプリケーションフレームワークは、Oracleによって開発され、Oracle Convergedアプリケーションを作成します。注釈の利点と短所を理解し、カスタム注釈を書く方法を知っていますが、アノテーションをどこに適用する必要がありますか? ADFはいくつかの単純な注釈を提供しますか?良い質問です。実際、ADFで注釈を使用することにはいくつかの制限があります。 SpringやHibernateなどの前述のアプリケーションフレームワークは、AOP(側面指向のプログラミング)を使用します。 AOPでは、フレームワークは、イベントの前処理とその後の処理にコードを注入するメカニズムを提供します。たとえば、メソッド実行の前後にコードを追加するフックがあるため、これらの場所にユーザーコードを記述できます。 ADFはAOPを使用しません。注釈のためのユースケースが利用可能な場合は、継承を通じて実装する必要がある場合があります。
注釈の意味をよりよく理解できるように、この記事が気に入っていただければ幸いです。