Подтвердить что ты не робот

Обработчик аннотации, генерирующий ошибку компилятора

Я пытаюсь создать пользовательскую аннотацию, которая, например, гарантирует, что поле или метод равно public и final, и будет генерировать ошибку времени компиляции, если поле или метод не оба public и final, как в этих примерах:

// Compiles
@PublicFinal
public final int var = 2;

// Compiles
@PublicFinal
public final void myMethod {}

// Compile time error
@PublicFinal
private final int fail = 2;

До сих пор я создал как пользовательский интерфейс аннотации:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface PublicFinal { }

и Processor:

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import java.util.Set;

@SupportedAnnotationTypes("PublicFinal")
public class PubicFinalProcessor extends AbstractProcessor
{
    @Override
    public boolean process(
            Set<? extends TypeElement> annotations,
            RoundEnvironment roundEnv)
    {
        for (TypeElement typeElement : annotations)
        {
            Set<Modifier> modifiers = typeElement.getModifiers();

            if (!modifiers.contains(Modifier.FINAL)
                    || !modifiers.contains(Modifier.PUBLIC))
            {
                // Compile time error.
                // TODO How do I raise an error?
            }
        }

        // All PublicFinal annotations are handled by this Processor.
        return true;
    }
}

Как намечено TODO, я не знаю, как генерировать ошибку времени компиляции. документация Процессора дает понять, что я не должен бросать исключение,

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

Далее описывается, что происходит, когда возникает условие ошибки, но теперь, как повысить условие ошибки.

Вопрос: как я могу вызвать условие ошибки, чтобы он генерировал ошибку времени компиляции?

4b9b3361

Ответ 1

Вероятно, вы хотите processingEnv.getMessager().printMessage(Kind.ERROR, "method wasn't public and final", element).

Messager: "Печать сообщения с ошибкой приведет к ошибке".