2016-08-24 5 views
1

Auf der einen Seite gibt es @NonNull, für die Oracle sagt: "Der Compiler kann Fälle ermitteln, in denen ein Codepfad einen Nullwert erhalten könnte, ohne jemals eine NullPointerException debuggen zu müssen." Also, ich nehme an, dass es zur Kompilierungszeit verarbeitet wird.Wann werden die Java-Anmerkungen verarbeitet?

Auf der anderen Seite gibt es @Inject, die Konstruktoren, Methoden und Felder unabhängig von ihren Zugriffsmodifizierer injiziert. Also, ich nehme an, sie werden zur Laufzeit verarbeitet.

Noch eine Sache, die mich verwirrt ist, dass die Felder zur Laufzeit injiziert werden können, obwohl sie privat sind. Bedeutet das, dass die Felder, die @Inject haben, Setter haben müssen?

Antwort

3

Es hängt vollständig von the runtime retention policy of the annotation.

Die Annotation @Inject zum Beispiel hat eine Aufbewahrungsrichtlinie von RUNTIME; Das bedeutet, dass laufender Code solche Annotationen untersuchen und darauf reagieren kann (hier durch "injecting" -Werte, wie der Name schon sagt).

Ich weiß nicht speziell über @NonNull, aber es funktioniert wahrscheinlich das gleiche wie @Nonnull von JSR 305, die eine Aufbewahrungsrichtlinie von CLASS hat. Es wird in Tools wie FindBugs verwendet, um beispielsweise eine Bytecode-Analyse durchzuführen und Warnungen zu erzeugen, bei denen ein Missbrauch eines derart annotierten Elements erkannt wird. Schließlich ist @Override ein Beispiel für eine Annotation mit einer Aufbewahrungsrichtlinie SOURCE, und der Compiler kann damit feststellen, dass der Code die Annotation missbraucht und einen Kompilierungsfehler auslöst.

+0

Und für die Frage nach dem Zugriff auf private Felder fand ich die Antwort [hier] (http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java). Vielen Dank. – gicig

Verwandte Themen