0

我刚刚开始学习 Java 中的注释处理。我有@MyAnnotation哪些目标ElementType.FIELD,我Processor将注释限制为只允许非空唯一value。哪个工作正常。

在记录错误以防有一些重复value设置为 时MyAnnotation.value,我想提供源代码中现有注释和新重复注释的完整路径。

我的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface   ProviderColumn {
    String content_id();
}

示例父类。

public class EnclosingParent {
    @ProviderColumn(content_id="Hello")
    private String value1;

    @ProviderColumn(content_id="Hello")
    private String value2;
}

我的注释处理器

@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment)
{
    UniqueColumnNameChecker columnNameChecker = new UniqueColumnNameChecker();

    try {

        for (Element annotatedElement : roundEnvironment.getElementsAnnotatedWith(ProviderColumn.class)) {

            // We can cast it, because we know that it is of ElementType.FIELD
            VariableElement variableElement = (VariableElement) annotatedElement;

            try {
                ProviderColumnId providerColumnId =
                        new ProviderColumnId(variableElement);

                // How can I get the EnclosingParent.class or even just a complete canonical class name?

                // throws a DuplicateAnnotationIdException when it detects duplicate entries.
                columnNameChecker.addAnnotationColumnName(providerColumnId);
            }
            catch (IllegalArgumentException e) {
                error(variableElement, e.getMessage());
                return true;
            }
        }
    }
    catch (DuplicateAnnotationIdException ex) {
        error(ex.getMessage());
        return true;
    }

    return true;
}

但是,我无法弄清楚如何从VariableElement. 由于我才刚刚开始,AnnotationProcessing我什至不确定这是否可行,而且我无法在 StackOverflow 或其他任何地方找到与此问题相关的任何问题。

预期的错误输出

Duplicate content_id()='Hello' detected, Found at 'com.example.EnclosingParent.value1' and 'com.example.EnclosingParent.value2'.

注意:我意识到如果我定义一个新的 Annotation 并设置为 Enclosure 类,我可以获得父信息ElementType.TYPE,但我希望避免这种情况,因为它为第三方开发人员增加了额外的责任。

4

1 回答 1

0

显然是愚蠢的问题。我在所有错误的地方寻找封闭元素,找到了这个优秀的注释处理器教程,其中指出:

元素和类型镜子

...

您可以将其视为您尝试解析的 XML 文件(或编译器构造中的抽象语法树)

我意识到它Element本身可能包含我需要的所有信息。

只需要打电话variableElement.getEnclosingElement()找家长Element

从那里开始很容易,您可以像这样获得封闭的类名:

element.getEnclosingElement().asType().toString();

然而,这并不能保证封闭元素是 of TypeElement。所以只需使用instanceof以确保它是。

于 2019-05-15T07:35:57.003 回答