当RoundEnvironment指向测试源时,如何在主源中扫描注释

时间:2016-10-12 18:52:23

标签: java annotation-processing annotation-processor

我创建了一个注释@EnableEntityProcessing,用于测试(src / test / java)。 我还创建了关联的注释处理器EnableEntityProcessingProcessor

EnableEntityProcessingProcessor的目的是扫描在src / main / java中找到的@Entity(javax.persistence.Entity)注释,并根据这些注释生成代码。我希望代码在测试资源下生成,因为它只能用于测试。

主要问题是RoundEnvironment对象指向测试代码,因为支持的注释是@EnableEntityProcessing(仅在测试中使用)。

public final class MyProcessor extends EnableEntityProcessingProcessor {
    private static final Class<EnableEntityProcessing> TEST_ANNOTATION_CLASS =
            EnableEntityProcessing.class;
    private static final Class<Entity> PROD_ANNOTATION_CLASS = Entity.class;

    @Override
    public final Set<String> getSupportedAnnotationTypes() {
        return ImmutableSet.of(TEST_ANNOTATION_CLASS.getCanonicalName());
    }

    @Override
    public final boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        final Set<? extends Element> elementsAnnotated = roundEnv.getElementsAnnotatedWith(TEST_ANNOTATION_CLASS);
        if (!elementsAnnotated.isEmpty()) {
            for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(PROD_ANNOTATION_CLASS)){
                // code generation based on properties from classes annotated with PROD_ANNOTATION_CLASS
            }
        }
    }
}

从代码示例中,您可以看到我正在扫描使用EnableEntityProcessing注释的元素,如果其中一个存在,那么我想查找使用Entity注释的类。问题是roundEnv找不到它们,因为它链接到测试源。

1 个答案:

答案 0 :(得分:0)

您可以实现处理器以便它由for RT in CONTENIDO: print RT self.loggerb.SetValue(RT) self.logggerb.Update() # force gui update wx.Sleep(1) # wait a second before going to next value 触发,将其应用于编译单元的主代码,然后使用@Entity之类的东西作为处理器生成的源的目录