我才刚刚开始学习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>
答案 0 :(得分:0)
显然是愚蠢的问题。我在所有错误的地方都找不到封闭元素,发现这个出色的Annotation Processor Tutorial指出:
元素和TypeMirrors
...
您可以将其视为您尝试解析的XML文件(或编译器构造中的抽象语法树)
我意识到Element
本身可能包含我需要的所有信息。
只需调用variableElement.getEnclosingElement()
以获得父级Element
从那里开始很容易,您可以像这样封装类名:
element.getEnclosingElement().asType().toString();
但是,这不能保证包围元素是TypeElement
的元素。因此,只需使用instanceof
来确保它正确。