Java 8 verfügt über eine Funktion namens Typ Anmerkungen (JSR 308). Ich würde es gerne für ein einfaches Objekt-zu-Objekt-Mapper-Framework verwenden. Ich möchte Anmerkung @ExpectedType wie dieseVerwendung benutzerdefinierter Anmerkungen in Java
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
public Class<?> value();
}
definieren und sie dann wie dies in meinem Code verwenden:
public class SomeServiceImpl() {
public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
return (ObjectA_Entity) obj; // it's correct
}
}
IObjectA
eine Schnittstelle von Klassen ObjectA_DTO
und ObjectA_Entity
implementiert ist. Der Service Ich mag würde auf diese Weise verwenden:
// it's correct
assert someService.doSomething(new ObjectA_DTO()).getClass() == ObjectA_DTO.class;
Ich würde ändern Aufruf von SomeServiceImpl Methoden wie Object Mapper zu verwenden. Dies könnte durch generierten Code unter Verwendung von JSR 269 oder durch AOP erreicht werden.
Das Problem ist, schrieb ich einfache Annotationen Prozessor und es behandelt überhaupt keine Typ Anmerkungen. Die Quelle von einfachen Anmerkungen Prozessor sieht wie folgt aus:
@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;
}
}
Irgendwelche Ideen, wie oder zu verwenden, wie Typenannotationen von SimpleAnnotationsProcessor zugreifen? Die Verwendung der Pluggable Annotation Processing API ist für mich nicht notwendig. Ich denke, sie hätte eine bessere Leistung als Java Reflection. Wie auch immer, ich weiß nicht, wie ich über Java Reflection auf den Typ Annotation zugreifen kann.
verwendet werden, ich denke, ich bin unklar, welches Ziel Sie erreichen wollen. Warum nicht einfach die Methodensignatur 'ObjectA_DTO doSomething (ObjectA_Entity) 'machen, wenn Sie das erwarten? –
Methodensignatur kann nicht so sein, weil ich Dienstinstanz wie dieses 'someService.doSomething (neues ObjectA_DTO())' verwenden möchte. Ich möchte den Object Mapper implementieren, um 'ObjectA_DTO' auf' ObjectA_Entity' abzubilden und Annotation zu schreiben. @ExpectedType definiert den Zieltyp. Aus diesem Grund muss die Signatur "IObjectA doSomething (IObjectA)" sein. –
Ich habe gerade Ihre Frage kurz gefasst ... Ich habe ein Semester Projekt zur Entwicklung von Produktlinien gemacht, wo wir Anmerkungen verarbeitet haben. Für den Moment werde ich Sie mit diesem wichtigen Tutorial verlassen, das mich wirklich zum Thema gebracht hat (Sie können Teil 3 über die Codegenerierung überspringen) - https://deors.wordpress.com/2011/09/26/annotation-types/ später werde ich diesen Beitrag erneut auf Fortschritte überprüfen. – ThisClark