Я только начинаю изучать обработку аннотаций в 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;
}
My 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, но я стараюсь избегать этого, поскольку это добавляет дополнительные обязанности для третьегоучастник разработчик.