我刚刚开始学习 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
,但我希望避免这种情况,因为它为第三方开发人员增加了额外的责任。