5

Я реализует процессор аннотаций, чтобы убедиться, что элементы, отмеченные аннотацией являются экземплярами класса, который реализует определенный интерфейс, или использование типов, которые реализуют определенный интерфейс:Как обрабатывать аннотации с помощью @Target (ElementType.TYPE_USE)?

@Documented 
@Target(value = { ElementType.PARAMETER, ElementType.TYPE_USE }) 
@Retention(value = RetentionPolicy.RUNTIME) 
public @interface AuditSubject { 

} 

public interface Auditable { 
    // methods that provide data for writing a log entry... 
} 

public class Report implements Auditable { 

} 

Для аннотированные элементы, запись журнала должна быть создана после выполнения метода (с использованием АОП). Примеры:

Записи журнала должны быть созданы при условии, что Report реализует Auditable; если это не так, исключается исключение во время выполнения (Yikes, я забыл реализовать интерфейс!). Таким образом, обработчик аннотации помогает ловить ошибки программиста во время компиляции. До сих пор мне удавалось проверять все применения в параметрах, но не на использование типов. Соответствующий код из процессора аннотаций выглядят следующим образом:

@Override 
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
    for (Element annotated : roundEnv.getElementsAnnotatedWith(AuditSubject.class)) { 
     // Only prints elements with ElementKind.PARAMETER)! 
     this.messager.printMessage(Kind.NOTE, TextUtils.replaceParams("annotated: {} ; Kind : {} ; enclosing : {}", annotated, annotated.getKind(), annotated.getEnclosingElement())); 

     if (annotated.getKind() == ElementKind.PARAMETER) { 
      // Code here works as expected, raises errors for annotated parameters of classes that don't implement Auditable. 
     } else if (annotated.getKind() == ElementKind.WHAT_TO_USE) { 
      // What ElementKind do I need to use here? 
     } 
    } 

    return false; 
} 

только аннотированные элементы с любезным ElementKind.PARAMETER признается (первая строка в цикле процесса() печатает только одну строку для 'newReport') Как я могу проверить, что аннотированные типы реализуют Auditable? Нет постоянного тока "ElementKind.TYPE_USE". Я не смог найти соответствующую информацию по этому вопросу. Спасибо за внимание.

ответ

4

API обработки аннотации Java был разработан, когда Java поддерживает только аннотации в объявлениях. API поддерживает только объявления посещений, такие как поля, методы и параметры метода. Он не посещает локальные объявления переменных, ни другие аннотации внутри тела метода, ни аннотации типов.

Если вы хотите обработать аннотации или аннотации типов в телах методов, вам нужно будет написать свой собственный код для повторной обработки по типам или для повторного рассмотрения строк кода в рамках метода.

Альтернативой этому является использование такого инструмента, как Checker Framework. Он реализует своих собственных посетителей, и поэтому построенный на нем обработчик аннотации вызывается для каждого появления аннотации типа.