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方法的调用更改为使用Object Mapper。可以通过使用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反射访问类型注释。
ObjectA_DTO doSomething(ObjectA_Entity)
呢? - Ian McLairdsomeService.doSomething(new ObjectA_DTO())
。我想要实现对象映射器来将ObjectA_DTO
映射到ObjectA_Entity
,并且类型注释 @ExpectedType 定义了目标类型。这就是为什么签名必须是IObjectA doSomething(IObjectA)
的原因。 - Boris Šuška@Target(ElementType.TYPE_PARAMETER)
或@Target(ElementType.TYPE_USE)
。它们不会传递到注解处理器的process
方法中。 - Boris Šuška