Înțelegerea adnotărilor Java – Tutorial Java @annotations
Publicat: 2019-10-22
Cum și unde sunt utilizate adnotările în Java?
O adnotare, în limbajul de programare Java, este o formă specială de metadate sintactice care poate fi adăugată la codul sursă Java.
Clasele, metodele, variabilele, parametrii și pachetele pot fi adnotate. Spre deosebire de etichetele Javadoc, adnotările Java pot fi reflectorizante prin faptul că pot fi încorporate în fișierele de clasă generate de compilator și pot fi reținute de VM Java pentru a fi recuperate în timpul execuției.
Este posibil să se creeze meta-adnotări din cele existente în Java, ceea ce face acest concept mai sofisticat.
Java definește un set de adnotări care sunt încorporate în limbaj.

Adnotări aplicate codului java:
- @Override – Verifică dacă funcția este o suprascriere. Provoacă un avertisment de compilare dacă funcția nu este găsită într-una dintre clasele părinte.
- @Deprecated – marchează funcția ca învechită. Provoacă un avertisment de compilare dacă funcția este utilizată.
- @SuppressWarnings – Instruiește compilatorului să suprime avertismentele de timp de compilare specificate în parametrii de adnotare.
Adnotări aplicate altor adnotări:
- @Retention – Specifică modul în care este stocată adnotarea marcată – fie numai în cod, compilată în clasă sau disponibilă în timpul execuției prin reflecție.
- @Documentat – marchează o altă adnotare pentru a fi inclusă în documentație.
- @Target – marchează o altă adnotare pentru a restricționa tipul de elemente java cărora li se poate aplica adnotarea.
- @Inherited – marchează o altă adnotare pentru a fi moștenită în subclasele clasei adnotate (în mod implicit, adnotările nu sunt moștenite la subclase).
Să aruncăm o privire la acestea prin exemple de exemple:
1) @Override Adnotare:
Prezența acestuia indică compilatorului că metoda adnotată trebuie să suprascrie o metodă superclasă existentă.
Cel mai frecvent caz de utilizare pentru @Override este cu metodele Object :
1 2 3 4 |
@ Override public int hashValue ( ) { System . out . Println ( "This method is using @Override Annotation" ) ; } |
Principalul motiv pentru care a fost creat @Override a fost acela de a face față unor erori de tipar simple.
De exemplu, o metodă declarată eronat ca
1 |
public int hashvalue ( ) { . . . } |
De fapt, nu este o înlocuire – numele metodei are toate literele mici , deci nu se potrivește exact cu numele metodei hashValue() . Cu toate acestea, se va compila perfect. O astfel de eroare este ușor de făcut și greu de prins, ceea ce este o combinație periculoasă. Utilizarea adnotării @Override vă împiedică să faceți astfel de erori.
Ar trebui să aveți obiceiul de a folosi @Override ori de câte ori suprascrieți o metodă superclasă.

2) @Adnotare depreciată:
Această adnotare indică faptul că elementul marcat este depreciat și nu mai trebuie utilizat. Compilatorul generează un avertisment ori de câte ori un program utilizează o metodă, o clasă sau un câmp cu adnotarea @Deprecated
.
Când un element este depreciat, ar trebui să fie documentat și folosind eticheta Javadoc @deprecated
, așa cum se arată în exemplul următor.
1 2 3 4 |
< strong > @ Deprecated < / strong > static void deprecatedMethod ( ) { System . out . Println ( "This method is Deprecated.." ) ; } |
3) @SuppressWarnings Adnotare:
Spune-i compilatorului, te rog nu striga. Știu ce fac .
1 2 3 4 |
@ SuppressWarnings ( "serial" ) public class OldCode implements Serializable { System . out . Println ( "This is Old Code.." ) ; } |
4) @Retention Adnotare:
Adnotarea de reținere indică unde și cât timp vor fi păstrate adnotările de acest tip.
Există trei valori:
- RetentionPolicy.SOURCE — Adnotările cu acest tip vor fi reținute numai la nivel de sursă și vor fi ignorate de compilator.
- RetentionPolicy.CLASS — Adnotările cu acest tip vor fi reținute de compilator în momentul compilării, dar vor fi ignorate de VM.
- RetentionPolicy.RUNTIME — Adnotările cu acest tip vor fi reținute de VM, astfel încât să poată fi citite numai în timpul execuției.
1 2 3 4 |
@ Retention ( RetentionPolicy . RUNTIME ) public @ interface Crunchify_Retention { String returnSomething ( ) ; } |
5) @Adnotare documentată:
1 2 3 4 |
@ Documented public @ interface Crunchify_Documented { String writeDocument ( ) ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class DocumentedAnnotations { public static void main ( String arg [ ] ) { new DocumentedAnnotations ( ) . performRetention ( ) ; new DocumentedAnnotations ( ) . performDocumented ( ) ; } @ Crunchify_Retention ( returnSomething = "Hello retention test" ) public void performRetention ( ) { System . out . printf ( "Testing annotation 'Crunchify_Retention'" ) ; } @ Crunchify_Documented ( writeDocument = "Hello document" ) public void performDocumented ( ) { System . out . printf ( "Testing annotation 'Crunchify_Documented'" ) ; } } |
Acum încercați să rulați comanda Java Doc și vedeți rezultatul.

6) @Adnotare țintă:
Țintă indică ce element(e) de program pot fi adnotate utilizând instanțe de tipul de adnotare adnotat. Valoarea Target este unul dintre membrii enumerarii java.lang.annotation.ElementType
:
- ANNOTATION_TYPE. Tipul de adnotare adnotat poate fi folosit pentru a adnota declarația tip adnotare.
- CONSTRUCTOR. Tipul de adnotare adnotat poate fi folosit pentru a adnota declarația constructorului.
- CAMP. Tipul de adnotare adnotat poate fi utilizat pentru a adnota declarația de câmp.
- LOCAL_VARIABLE. Tipul de adnotare adnotat poate fi utilizat pentru a adnota declarația variabilelor locale.
- METODĂ. Tipul de adnotare adnotat poate fi utilizat pentru a adnota declarația metodei.
- PACHET. Tipul de adnotare adnotat poate fi utilizat pentru adnotarea declarațiilor de pachet.
- PARAMETRU. Tipul de adnotare adnotat poate fi utilizat pentru adnotarea declarațiilor de parametri.
- TIP. Tipul de adnotare adnotat poate fi utilizat pentru adnotarea declarațiilor de tip.
1 2 3 4 |
@ Target ( value = METHOD ) You can have multiple values in the Target annotation . @ Target ( value = { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE } ) |
7) @Adnotare moștenită:
Exact așa cum sună numele, un tip de adnotare @Inherited
este moștenit de subclase de tip adnotat.
1 2 3 4 5 6 7 8 9 10 |
@ Inherited @ interface ForEveryone { } @ interface JustForMe { } @ ForEveryone @ JustForMe class Superclass { } class Subclass extends Superclass { } |
În acest exemplu, Superclass
a fost adnotat în mod explicit atât cu @ForEveryone
, cât și cu @JustForMe
. Subclass
nu a fost marcată explicit cu nici una; totuși, moștenește @ForEveryone
deoarece acesta din urmă este adnotat cu @Inherited
.
@JustForMe
nu este adnotat, deci nu este moștenit de Subclass
.
Iată adnotări la nivel de clasă
