Я реализует процессор аннотаций, чтобы убедиться, что элементы, отмеченные аннотацией являются экземплярами класса, который реализует определенный интерфейс, или использование типов, которые реализуют определенный интерфейс:Как обрабатывать аннотации с помощью @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"
. Я не смог найти соответствующую информацию по этому вопросу. Спасибо за внимание.