保持アノテーション
Retention 注釈は、このタイプの注釈がどの段階まで保持されるかを示します。次の 3 つの値があります。
1.RetentionPolicy.SOURCE - このタイプの注釈はソース コード レベルでのみ保持され、コンパイル中に無視されます。
2.RetentionPolicy.CLASS - このタイプのアノテーションはコンパイル中に保持され、クラス ファイル内に存在しますが、JVM はそれを無視します。
3.RetentionPolicy.RUNTIME - このタイプのアノテーションは JVM によって保持されるため、実行時にリフレクション メカニズムを使用して JVM または他のコードで読み取って使用できます。
例 5 は、RetentionPolicy.RUNTIME の宣言を示しています。
Java アノテーションの例 1:
次のようにコードをコピーします。
@Retention(RetentionPolicy.RUNTIME)
public @interface Test_Retention {
文字列 doTestRetention();
}
この例では、 @Retention(RetentionPolicy.RUNTIME) アノテーションは、実行時にリフレクションを通じて読み取れるように、Test_Retention アノテーションが仮想マシンによって保持されることを示します。
文書化された注釈
Documented アノテーションは、このアノテーションが javadoc ツールによって記録されるべきであることを示します。ただし、アノテーションの宣言時に @Documented が指定されている場合、アノテーションのタイプ情報が記録されます。例 6 は、@Documented の使用法をさらに示しています。
Java アノテーションの例 2:
次のようにコードをコピーします。
@文書化されました
public @interface Test_Documented {
文字列 doTestDocument();
}
次に、TestAnnotations クラスを次のように変更します。
次のようにコードをコピーします。
パブリック クラス TestAnnotations {
public static void main(String arg[]) {
new TestAnnotations().doSomeTestRetention();
new TestAnnotations().doSomeTestDocumented();
}
@Test_Retention (doTestRetention="アノテーション情報の保持テスト")
public void doSomeTestRetention() {
System.out.printf("アノテーション タイプ 'Retention' をテストします");
}
@Test_Documented(doTestDocument="Hello ドキュメント")
public void doSomeTestDocumented() {
System.out.printf("アノテーション タイプ 'Documented' をテストします");
}
}
ここで、javadoc コマンドを使用して TestAnnotations.html ファイルを生成すると、図 1 のような結果が表示されます。
スクリーンショットからわかるように、ドキュメントには doSomeTestRetention() メソッドのアノテーション タイプ情報 () メソッドはありませんが、doSomeTestDocumented() メソッドのドキュメントにはアノテーションの説明情報が提供されているためです。 @Documented タグが Test_Documented アノテーションに追加されました。前のアノテーション Test_Retention では @Documented タグが指定されていませんでした。
継承されたアノテーション (この段落には何か間違っている可能性があります...)
これは、少し複雑なアノテーション タイプで、アノテーションを定義するときに @Inherited タグが使用され、その定義されたアノテーションが別の親クラスにアノテーションを付けるために使用される場合に、アノテーションが付けられたクラスが自動的に継承されることを示します。サブクラスがある場合、親クラスのすべてのプロパティがそのサブクラスに継承されます。例 7 では、@Inherited タグを使用する利点がわかります。
Java アノテーションの例 3
まず、アノテーションを定義します。
次のようにコードをコピーします。
@継承
public @interface MyParentObject {
ブール値 isInherited() デフォルトは true;
String doSomething() デフォルト「何をしますか?」;
}
次に、クラスにアノテーションが付けられます。
次のようにコードをコピーします。
@MyParentObject
パブリック クラス MyChildObject {
}
ご覧のとおり、実装クラスでインターフェイス メソッドを定義する必要はありません。 @Inherited タグがあるため、これらは自動的に継承されます。実装クラスを定義する従来の方法を使用するとどうなるでしょうか。以下を見てください。これは古い実装です。
次のようにコードをコピーします。
パブリック クラス MyChildObject は MyParentObject を実装します {
public boolean isInherited() {
false を返します。
}
public String doSomething() {
戻る "";
}
public booleanquals(Object obj) {
false を返します。
}
public int hashCode() {
0を返します。
}
public String toString() {
戻る "";
}
public Class annotationType() {
null を返します。
}
}
違いがわかりますか? ご覧のとおり、myParentObject の isInherited() メソッドと doSomething() メソッドに加えて、equals() と toString() のメソッドも実装する必要があります。 ) および hasCode() メソッドもあります。 java.lang.annotation.Annotation クラスの annotationType() メソッドもあります。これらのメソッドを実装するかどうかに関係なく、継承されたオブジェクトにこれらを含める必要があります。
結論は
この記事では、JDK5 のアノテーション機能を使用して開発を容易にする方法を説明します。アノテーションはプログラムのセマンティクスに直接影響しません。開発およびデプロイメント ツールは、これらのアノテーションを読み取って処理し、アノテーションを含むプログラムを使用します。注釈を使用すると、追加の Java ソース ファイル、XML ドキュメント、またはその他の古い成果物を置き換えることができ、より少ないコードで同じことを実現でき、コンパイル時のエラー検出が向上します。アノテーションの目的は、難しくて役に立たない詳細に費やす時間を減らし、ビジネス ロジック ルールに重点を置くことです。この記事は Java アノテーション シリーズの第 1 部であり、第 2 部では、アノテーションを使用して単純なコードを開発する方法を学びます。 Web アプリケーション。最後のパート 3 では、複数のデータベース テーブルを含む複雑な例を示します。