如何在运行时使用注释处理API?

时间:2012-04-20 06:47:11

标签: java annotations apt

我已经并且在互联网上遵循了几个注释处理工具(APT)指南(例如12),并设法让它在编译/构建时工作,甚至得到它在Eclipse工作。

有没有办法在运行时使用APT来获取使用我的注释的类型(类)列表。

我写了类似的东西:

@SupportedAnnotationTypes("com.domain.MyAnnotation")
public class MyAbstractProcessor extends AbstractProcessor {

    public static Map<Element, MyAnnotation> patches = new HashMap<Element, MyAnnotation>();

    @Override
    public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnvironment) {

        // Get all classes that has the annotation
        Set<? extends Element> classElements = roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class);

        // For each class that has the annotation
        for (final Element classElement : classElements) {

            patches.put(classElement, annotation);

因此MyAbstractProcessor.patches将使用注释填充类列表。这是一个高尚的想法,除了这个APT在构建时执行的缺陷,而不是运行时间。

甚至可以在运行时使用APT吗?

或者我使用错误的框架来获得我想要的东西?

2 个答案:

答案 0 :(得分:4)

您可以使用反射 - getAnnotations在运行时访问注释。

要使用注释获取类列表(在类路径中),您可以 - 在运行时 - 遍历所有类测试,如果它们具有该注释。

或者 - 在构建时 - 您可以构造一个包含类列表的类。

答案 1 :(得分:1)

您是否在运行时使用RetentionPolicy指定了注释? 如果不是,则需要在您的上使用@Retention注释。

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {
    String[] parameters();
    String[] exceptions();
}