Java 8 dispone di funzionalità denominate annotazioni Tipo (JSR 308). Mi piacerebbe usarlo per semplice framework di mappatura Object to Object. Vorrei definire annotazione @ExpectedType come questoCome utilizzare annotazioni di tipo personalizzato in Java
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
public Class<?> value();
}
e poi utilizzarlo nel mio codice come questo:
public class SomeServiceImpl() {
public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
return (ObjectA_Entity) obj; // it's correct
}
}
IObjectA
è un'interfaccia implementata da classi ObjectA_DTO
e ObjectA_Entity
. Il servizio Vorrei utilizzare in questo modo:
// it's correct
assert someService.doSomething(new ObjectA_DTO()).getClass() == ObjectA_DTO.class;
Vorrei cambiamento richiamo di metodi SomeServiceImpl usare mapper oggetto. Potrebbe essere ottenuto con il codice generato utilizzando JSR 269 o tramite AOP.
Il problema è che ho scritto un semplice processore di annotazioni e non gestisce affatto le annotazioni di tipo. La fonte di semplice elaboratore di annotazioni assomiglia a questo:
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class SimpleAnnotationsProcessor extends AbstractProcessor {
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Messager messager = processingEnv.getMessager();
try {
for (TypeElement e : annotations) {
messager.printMessage(Diagnostic.Kind.NOTE, e.toString());
for (Element elem : roundEnv.getElementsAnnotatedWith(e)) {
messager.printMessage(Diagnostic.Kind.NOTE, elem.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
Delle idee come utilizzare o come accedere annotazioni di tipo da SimpleAnnotationsProcessor? L'utilizzo dell'API di elaborazione di annotazioni innestabili non è necessario per me, penso che avrebbe prestazioni migliori rispetto alla riflessione Java. Ad ogni modo non so come accedere all'annotazione del tipo tramite Java Reflection.
Credo di essere chiaro quale obiettivo si sta cercando di raggiungere. Perché non creare solo la firma del metodo 'ObjectA_DTO doSomething (ObjectA_Entity)' se è quello che ti aspetti che faccia? –
La firma del metodo non può essere così, perché mi piacerebbe usare un'istanza di servizio come questa 'someService.doSomething (new ObjectA_DTO())'. Voglio implementare object mapper per mappare 'ObjectA_DTO' su' ObjectA_Entity' e digitare annotation @ExpectedType definisce il tipo di destinazione. È la ragione per cui la firma deve essere "IObjectA doSomething (IObjectA)". –
Ho appena ricevuto la tua domanda di passaggio ... Ho fatto un progetto semestrale sullo sviluppo della linea di prodotti in cui abbiamo elaborato le annotazioni. Per ora, ti lascerò con questo importante tutorial che mi ha fatto davvero andare sull'argomento (puoi saltare la parte 3 sulla generazione del codice) - https://deors.wordpress.com/2011/09/26/annotation-types/ più tardi, ricontrollerò questo post per i progressi. – ThisClark