Creare annotazioni custom in Java
In Java conosciamo le annotazioni principalmente da Spring che ne fa largo uso.
Col passare del tempo sono uscite parecchie librerie che ci consentono di usarel (chi ha detto Lombock?).
Volendo è possibile anche crearne di custom.
Ovviamente non vi capiterà spesso di usarle, ma può essere utile sapere come fare.
In questo articolo vediamo un esempio basico per cominciare.
Per creare un'annotazione dovete creare una @interface (notare la chiocciola):
package org.example;
import java.lang.annotation.*;
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BookInfo {
String titolo();
double prezzo();
}
Dove:
- @Inherited -> indica che verrà automaticamente ereditate da eventuali classi figlie
- @Target(ElementType.METHOD) -> indica a cosa possiamo applicare l'annotation; in questo caso ad un metodo
- @Retention(RetentionPolicy.RUNTIME) -> indica che verrà processata a RUNTIME; è la più comune nel caso di utilizzo custom
Ora creiamo una classe per fare dei test:
package org.example;
public class TestAnnotation {
@Override
@BookInfo(titolo = "test", prezzo = 100.2)
public String toString() {
return "CIAO!";
}
}
Qui abbiamo usato due annotations:
- @Override -> standard di Java che indica che stiamo "sovrascrivendo" un metodo
- @BookInfo -> alla quale passiamo dei valori
Infine usiamo la Reflection:
package org.example;
import java.lang.reflect.Method;
import java.lang.annotation.Annotation;
public class Main {
public static void main(String[] args) {
try {
Method[] methods = Main.class.getClassLoader().loadClass(("org.example.TestAnnotation")).getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(BookInfo.class)) {
for (Annotation annotation : method.getDeclaredAnnotations()) {
System.out.println("Metodo: " + method + " -> Annotazione : " + annotation);
}
BookInfo bookInfo = method.getAnnotation(BookInfo.class);
if (bookInfo.prezzo() > 0) {
System.out.println(bookInfo.titolo());
}
}
}
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
}
}
Enjoy!
java annotations reflection
Commentami!