2016-08-24 10 views
1

一方で、@NonNullがあります。これは、「コンパイラは、コードパスがnull値を受け取る可能性のあるケースを、NullPointerExceptionをデバッグすることなく判断できます」と述べています。だから、私はそれがコンパイル時に処理されると思います。Java注釈はいつ処理されますか?

一方、アクセス修飾子にかかわらず、コンストラクタ、メソッド、およびフィールドを注入する@Injectがあります。だから、私は彼らが実行時に処理されると思います。

私を混乱させるもう一つの事は、プライベートであっても実行時にフィールドを注入できることです。 @Injectのフィールドにはセッターが必要ですか?

答えて

3

これは完全にthe runtime retention policy of the annotationに依存します。

たとえば、@Inject注釈の保存ポリシーはRUNTIMEです。これは実行中のコードがそのようなアノテーションを検査し、そのアノテーション(ここでは名前が示唆するように値を「注入」すること)で動作することを意味します。

具体的には@NonNullについてはわかりませんが、保持ポリシーがCLASSのJSR 305の@Nonnullと同じように動作すると考えられます。たとえば、FindBugsなどのツールでバイトコード解析を実行し、注釈付き要素の誤使用が検出された場合に警告を生成します。

最後にSOURCE保持ポリシーを持つ注釈の例であり、コンパイラはそれを使用してコードが注釈を誤って使用してコンパイルエラーを起こしたと判断します。

+0

プライベートフィールドへのアクセスに関する質問で私は答えを見つけました[ここ](http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java)。ありがとう。 – gicig

関連する問題