6

我已经并遵循了 Internet 上的几个 Annotation Processing Tool (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 吗?

还是我使用了错误的框架来获得我想要的东西?

4

2 回答 2

5

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

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

或者 - 在构建时 - 您可以构建一个带有类列表的类。

于 2012-04-20T06:51:17.423 回答
1

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

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {
    String[] parameters();
    String[] exceptions();
}
于 2012-04-20T07:00:51.023 回答