获取javax.annotation.processing.Processor中VariableElement的封闭类名

时间:2019-05-15 06:25:00

标签: java android annotation-processing annotation-processor

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

虽然在某些情况下确实存在某些重复value设置为MyAnnotation.value的情况下发生日志记录错误,但我想提供源代码中现有注释和新副本中完整注释的完整路径。 / p>

我的注释:

@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;
}

我的AnnotationProcessor

@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'.

注意:我知道如果定义一个新的ElementType.TYPE注释并将其设置为Enclosing类,便可以获取父级信息,但我希望避免这样做,因为它增加了第三方开发人员的责任。 / p>

1 个答案:

答案 0 :(得分:0)

显然是愚蠢的问题。我在所有错误的地方都找不到封闭元素,发现这个出色的Annotation Processor Tutorial指出:

  

元素和TypeMirrors

     

...

     

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

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

只需调用variableElement.getEnclosingElement()以获得父级Element

从那里开始很容易,您可以像这样封装类名:

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

但是,这不能保证包围元素是TypeElement的元素。因此,只需使用instanceof来确保它正确。