【发布时间】:2014-12-22 16:40:50
【问题描述】:
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 或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 访问类型注释?对我来说不需要使用 Pluggable Annotation Processing API,我认为它比 Java 反射具有更好的性能。反正我也不知道如何通过 Java Reflection 访问类型注解。
【问题讨论】:
-
我想我不清楚你想要达到什么目标。如果这是您所期望的,为什么不直接创建方法签名
ObjectA_DTO doSomething(ObjectA_Entity)? -
方法签名不能这样,因为我想使用这样的服务实例
someService.doSomething(new ObjectA_DTO())。我想实现对象映射器以将ObjectA_DTO映射到ObjectA_Entity并且类型注释@ExpectedType 定义目标类型。这就是为什么签名必须是IObjectA doSomething(IObjectA)。 -
我只是顺便抓住了你的问题......我做了一个关于产品线开发的学期项目,我们在其中处理注释。现在,我将把这个重要的教程留给你,它确实让我继续研究这个主题(你可以跳过关于代码生成的第 3 部分)-deors.wordpress.com/2011/09/26/annotation-types 稍后,我将重新检查这篇文章的进度。
-
感谢您的链接,我说的是注释为
@Target(ElementType.TYPE_PARAMETER)或@Target(ElementType.TYPE_USE)的注释。它们不会传递给注释处理器的process方法。
标签: java java-8 annotation-processing type-annotation