誰もが明確な方法で説明することができます間の実用的な違いjava.lang.annotation.RetentionPolicy
定数SOURCE
、CLASS
およびRUNTIME
?
また、「注釈を保持する」というフレーズの意味がよくわかりません。
誰もが明確な方法で説明することができます間の実用的な違いjava.lang.annotation.RetentionPolicy
定数SOURCE
、CLASS
およびRUNTIME
?
また、「注釈を保持する」というフレーズの意味がよくわかりません。
回答:
RetentionPolicy.SOURCE
:コンパイル中に破棄します。これらの注釈は、コンパイルが完了した後は意味をなさないため、バイトコードに書き込まれません。
例:@Override
、@SuppressWarnings
RetentionPolicy.CLASS
:クラスのロード中に破棄します。バイトコードレベルの後処理を行うときに役立ちます。少し意外なことに、これがデフォルトです。
RetentionPolicy.RUNTIME
: 廃棄禁止。アノテーションは、実行時にリフレクションに使用できる必要があります。例:@Deprecated
出典:
古いURLは現在死んでいます
hunter_metaとhunter-meta-2-098036に置き換えられました。これでも下がる場合はページの画像をアップロードしています。
画像(右クリックして[新しいタブ/ウィンドウで画像を開く]を選択)
RetentionPolicy.CLASS
apt
これを参照廃止されましたdocs.oracle.com/javase/7/docs/technotes/guides/apt/...。リフレクションを使用して注釈を発見するために、インターネット上に複数のチュートリアルがあります。あなたはに見ることで起動することができjava.lang.Class::getAnno*
、同様の方法でjava.lang.reflect.Method
とjava.lang.reflect.Field
。
クラスの逆コンパイルについてのあなたのコメントによると、これは私がそれがうまくいくはずだと私が思う方法です:
RetentionPolicy.SOURCE
:逆コンパイルされたクラスに表示されません
RetentionPolicy.CLASS
:逆コンパイルされたクラスに表示されますが、次のリフレクションでは実行時に検査できません getAnnotations()
RetentionPolicy.RUNTIME
:逆コンパイルされたクラスに表示され、実行時にリフレクションを使用して検査できます getAnnotations()
最小限の実行可能な例
言語レベル:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}
@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}
@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}
public static void main(String[] args) {
@RetentionSource
class B {}
assert B.class.getAnnotations().length == 0;
@RetentionClass
class C {}
assert C.class.getAnnotations().length == 0;
@RetentionRuntime
class D {}
assert D.class.getAnnotations().length == 1;
}
バイトコードレベル:注釈付きクラスがRuntimeInvisibleクラス属性を取得javap
することを確認します。Retention.CLASS
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
一方、Retention.RUNTIME
アノテーションはRuntimeVisibleクラス属性を取得します。
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
そして、Runtime.SOURCE
注釈付き.class
は、いかなる注釈も取得しません。
GitHubの例で遊んでください。
保持ポリシー:保持ポリシーは、注釈が破棄される時点を決定します。これは、Javaの組み込みアノテーションを使用して指定されます:@Retention
[概要]
1.SOURCE: annotation retained only in the source file and is discarded
during compilation.
2.CLASS: annotation stored in the .class file during compilation,
not available in the run time.
3.RUNTIME: annotation stored in the .class file and available in the run time.