В Java 8 есть функция, называемая аннотациями типов (JSR 308). Я хотел бы использовать его для простой структуры сопоставления объектов с объектами. Я хотел бы определить аннотацию @ExpectedType следующим образом
@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 для использования средства сопоставления объектов. Этого можно добиться с помощью сгенерированного кода с использованием JSR 269 или с помощью АОП.
Проблема в том, что я написал простой процессор аннотаций, и он вообще не обрабатывает аннотации типов. Исходник простого обработчика аннотаций выглядит так:
@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? Использование Pluggable Annotation Processing API мне не нужно, я думаю, что это будет иметь лучшую производительность, чем отражение Java. Во всяком случае, я не знаю, как получить доступ к аннотации типа через Java Reflection.
ObjectA_DTO doSomething(ObjectA_Entity)
, если это именно то, что вы ожидаете от него? - person Ian McLaird   schedule 23.12.2014someService.doSomething(new ObjectA_DTO())
. Я хочу реализовать средство сопоставления объектов для сопоставленияObjectA_DTO
сObjectA_Entity
, а аннотация типа @ExpectedType определяет тип назначения. Именно поэтому подпись должна бытьIObjectA doSomething(IObjectA)
. - person Boris Šuška   schedule 03.01.2015@Target(ElementType.TYPE_PARAMETER)
или@Target(ElementType.TYPE_USE)
. Они не передаются методуprocess
обработчика аннотаций. - person Boris Šuška   schedule 05.01.2015