Java 8 имеет функцию, называемую аннотациями типа (JSR 308). Я хотел бы использовать его для простой структуры Object Mapper. Я хотел бы определить аннотаций @ExpectedType как этотКак использовать аннотации пользовательского типа в Java
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
public Class<?> value();
}
И затем использовать его в своем коде, как это:
public class SomeServiceImpl() {
public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
return (ObjectA_Entity) obj; // it's correct
}
}
IObjectA
является интерфейс, реализуемый классами ObjectA_DTO
и ObjectA_Entity
. Услуга Я хотел бы использовать этот способ:
// it's correct
assert someService.doSomething(new ObjectA_DTO()).getClass() == ObjectA_DTO.class;
Я хотел бы изменить вызов методов SomeServiceImpl использовать картограф Object. Это может быть достигнуто сгенерированным кодом с использованием JSR 269 или AOP.
Проблема в том, что я написал простой обработчик аннотаций и вообще не обрабатывает аннотации типов. Источник простой аннотации процессор выглядит следующим образом:
@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;
}
}
Любые идеи, как использовать или как получить доступ к аннотацию типа с помощью SimpleAnnotationsProcessor? Использование API совместимой обработки аннотаций для меня не требуется. Я думаю, что он будет иметь лучшую производительность, чем отражение Java. Во всяком случае, я не знаю, как получить доступ к аннотации типов через Java Reflection.
Я предполагаю, что я не ясно, какую цель вы пытаетесь достичь. Почему бы просто не сделать подпись метода 'ObjectA_DTO doSomething (ObjectA_Entity)', если это то, что вы ожидаете от нее? –
Подпись метода не может быть так, потому что я хотел бы использовать служебный экземпляр, как этот 'someService.doSomething (новый ObjectA_DTO())'. Я хочу, чтобы объект mapper сопоставил 'ObjectA_DTO' с' ObjectA_Entity' и аннотацию типа @ExpectedType определяет тип назначения. Это причина, почему подпись должна быть «IObjectA doSomething (IObjectA)». –
Я просто поймал ваш вопрос попутно ... Я сделал семестр проекта по разработке линейки продуктов, где мы обработали аннотации. На данный момент я оставлю вас с этим важным учебным пособием, который действительно заставил меня заняться этим вопросом (вы можете пропустить часть 3 о генерации кода) - https://deors.wordpress.com/2011/09/26/annotation-types/ позже я перепроверку этого поста для прогресса. – ThisClark