アノテーション「@Retention」の役割
アノテーション@Retentionは、メタアノテーションと呼ばれるアノテーションのアノテーションであるアノテーションを修正するために使用することができます。
Retentionアノテーションは、属性値がRetentionPolicy型であり、Enum RetentionPolicyは、以下の列挙型である。
この列挙は、Retentionアノテーションの維持方法を決定し、Rentention with RententionPolicyと解釈することができる。
ライフサイクル別に3つに分類される。
1. RetentionPolicy.SOURCE: アノテーションはソースファイルにのみ保持され、Javaファイルがクラスファイルにコンパイルされた時点で放棄されます。
2. RetentionPolicy.CLASS: アノテーションはクラスファイルに保持されますが、クラスファイルがjvmによってロードされたときに破棄されます(これはデフォルトのライフサイクルです)。
3. 3. RetentionPolicy.RUNTIME: アノテーションはクラスファイル内に保存されるだけでなく、jvmがクラスファイルをロードした後も残ります。
この3つのライフサイクルに対応します。Javaソースファイル(.javaファイル) ---> .classファイル ---> メモリ内のバイトコード。
では、どのようにして正しいアノテーションライフサイクルを選択すればよいのでしょうか。
まず、ライフサイクルの長さを明確にすることです SOURCE < CLASS < RUNTIME , 前者が機能するところでは、後者も機能しなければなりません。
一般的に、実行時に動的にアノテーション情報を取得する必要がある場合は、RUNTIMEアノテーションを使用する@Deprecated using RUNTIMEアノテーションのように
コンパイル時に何らかのヘルパーコード(ButterKnifeなど)を生成するなど、前処理を行いたい場合は、CLASSアノテーションを使用します。
Overrideや@SuppressWarningsのように、いくつかの検査操作を行うだけなら、SOURCEアノテーションを使用します。
アノテーション@Overrideはメソッドに対して使用します。あるメソッドをオーバーライドしたい場合、メソッドに@Overrideを付けると、コンパイラーはメソッドの名前が間違っている場合にエラーを報告します。
クラスやプロパティ、メソッドが非推奨であり、他の誰にも使ってほしくないことを示すために@Deprecatedをアノテーションし、プロパティやメソッドに@Deprecatedを付けて修正します。
SuppressWarningsアノテーションは、汎用型が使用されていない場合やメソッドが非推奨である場合など、プログラムから出る警告を抑制するために使用されます
から取得した。
http://blog.csdn.net/liuwenbo0920/article/details/7290586
http://blog.csdn.net/github_35180164/article/details/52118286
英語の得意な方は、以下のソースコードを読んでみてください。
package java.lang.annotation;
/**annotation
* The constants of this enumerated type describe the various policies for retaining annotations.
The constants of this enumerated type * describe the various policies for retaining annotations.
The constants of this enumerated type * describe the various policies for retaining annotations.
They are used * in conjunction with the {@link Retention} meta-annotation type to specify * how long annotations are to be retained.
*The following are the various policies for retaining annotations.
* @author Joshua Bloch
* @since 1.5
*/
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/*
* Annotations are to be recorded in the class file by the compiler
* This is the default
* This is the default behavior.
*/This is the default * behavior.
CLASS,
/**This is the default * behavior.
This is the default * behavior, /* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
AnnotatedElement */
RUNTIME
RUNTIME }
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
/*
* The set of warnings that are to be suppressed by the compiler in the
* Duplicate names are permitted.
The second and * successive occurrences of a name are ignored.
The presence of * unrecognized warning names is <i>not</i> an error: Compilers must
The presence of * unrecognized warning names is <i>not</i> an error: Compilers must * ignore any warning names they do not recognize,
They are, however, * free to emit a warning if an annotation contains an unrecognized
They are, however, * free to emit a warning if an annotation contains an unrecognized warning name.
They are, however, * free to emit a warning if an annotation contains an unrecognized * warning name.
Compilers must * ignore any warning names they do not recognize.
* Compiler vendors should document the
Compiler vendors should document the * additional warning names they support in conjunction with this
* They are encouraged to cooperate to ensure
They are encouraged to cooperate to ensure * that the same names work across multiple compilers.
* @return the set of warnings to be suppressed
@return the set of warnings to be suppressed */
String[] value();
}
/*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates.
All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. use is subject to license terms.
*Use is subject to license terms.
*/
package java.lang;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
/**
* A program element annotated @Deprecated is one that programmers
* are discouraged from using, typically because it is dangerous,
* Compilers warn when a
Compilers warn when a * deprecated program element is used or overridden in non-deprecated code.
*
* @author Neal Gafter
* @since 1.5
* @jls 9.6.3.6 @Deprecated
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
<イグ
関連
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Java基礎編 - オブジェクト指向
-
eclipse にリソースリーク:'in' が閉じない
-
Java上級(XLVI) ArrayList、Vector、LinkedListの類似点と相違点を簡単に説明できる。
-
javaの継承の基本的な実装
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プロジェクトの依存関係を解決できない。
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
Javaジェネリックを1つの記事で
-
-bash: java: コマンドが見つからない 解決方法
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
java1.8ソースコード ArrayListソースコード解釈