Java 8 ma funkcję o nazwie Adnotacje typu (JSR 308). Chciałbym użyć go do prostego systemu mapowania obiektów do obiektu. Chciałbym określić adnotacji @ExpectedType jak tenSposób korzystania z adnotacji typu niestandardowego w Javie
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
public Class<?> value();
}
a następnie używać go w moim kodu tak:
public class SomeServiceImpl() {
public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
return (ObjectA_Entity) obj; // it's correct
}
}
IObjectA
jest realizowany przez interfejs klas ObjectA_DTO
i ObjectA_Entity
. Usługa Chciałbym wykorzystać ten sposób:
// it's correct
assert someService.doSomething(new ObjectA_DTO()).getClass() == ObjectA_DTO.class;
chciałbym zmiana połączenia metod SomeServiceImpl użyć mapowania obiektów. Można to osiągnąć za pomocą wygenerowanego kodu przy użyciu JSR 269 lub AOP.
Problem polega na tym, że napisałem prosty procesor adnotacji i w ogóle nie obsługuję adnotacji typu. Źródłem prosty procesor adnotacji wygląda następująco:
@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;
}
}
pomysłów jak wykorzystać lub uzyskiwania dostępu typu adnotacji przez SimpleAnnotationsProcessor? Używanie Pluggable Adnotation Processing API nie jest dla mnie konieczne, myślę, że miałoby lepszą wydajność niż odbicie Java. W każdym razie nie wiem jak uzyskać dostęp do adnotacji typu za pomocą Java Reflection.
Chyba jestem jasne, co cel starasz się osiągnąć. Czemu po prostu nie utworzyć sygnatury metody 'ObjectA_DTO doSomething (ObjectA_Entity)' jeśli tego oczekujesz? –
Podpis metody nie może być taki, ponieważ chciałbym użyć instancji usługi takiej jak ta 'someService.doSomething (new ObjectA_DTO())'. Chcę, aby obiekt mapujący obiekt zamapował obiekt 'ObjectA_DTO' na' ObjectA_Entity', a typ adnotacji @ExpectedType określa typ miejsca docelowego. To jest powód, dla którego podpis musi być 'IObjectA doSomething (IObjectA)'. –
Właśnie przechwyciłem twoje pytanie ... Zrobiłem semestralny projekt dotyczący rozwoju linii produktów, w którym przetwarzaliśmy adnotacje. Na razie opowiem Ci o tym ważnym samouczku, który naprawdę mnie poruszył (możesz pominąć część trzecią o generowaniu kodu) - https://deors.wordpress.com/2011/09/26/annotation-types/ później ponownie sprawdzę ten post, aby uzyskać postęp. – ThisClark