1. ホーム
  2. Java

アノテーション「@Retention」の役割

2022-02-12 23:45:39

アノテーション@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 {
}

<イグ