2013-07-31 16 views
14

Sto tentando di creare un'annotazione personalizzata che, ad esempio, assicura che un campo o un metodo sia sia public sia final e generi un errore di tempo di compilazione se il campo o il metodo non è sia public e final, come in questi esempi:Processore di annotazione, generazione di un errore del compilatore

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

// Compiles 
@PublicFinal 
public final void myMethod {} 

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

Finora, ho fatto sia l'interfaccia di annotazione personalizzata:

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 { } 

e 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; 
    } 
} 

Come suggerito dallo TODO, non so come generare l'errore del tempo di compilazione. La documentation di processore rende chiaro che non dovrebbe essere un'eccezione,

Se un processore genera un'eccezione non rilevata, lo strumento può cessare altri processori di annotazione attivi.

Si va avanti a descrivere ciò che accade quando una condizione di errore viene generato, ma ora come per sollevare una condizione di errore.

Domanda: come si genera una condizione di errore tale da generare un errore di compilazione?

risposta

15

Probabilmente si desidera processingEnv.getMessager().printMessage(Kind.ERROR, "method wasn't public and final", element).

Messager: "La stampa di un messaggio con un tipo di errore genera un errore."

Problemi correlati