La création d'une coutume AbstractProcessor et l'intégration avec Eclipse

Je suis en train de créer une nouvelle annotation avec qui je vais faire quelques exécution de câblage, mais pour un certain nombre de raisons, je tiens à vérifier au moment de la compilation que mon câblage sera couronnée de succès avec certains rudimentaire des contrôles.

Supposons que je créer une nouvelle annotation:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation{
}

Maintenant, je veux faire une sorte de validation au moment de la compilation, à l'instar de vérifier le champ que CustomAnnotation annote est d'un type particulier: ParticularType. Je travaille dans la version 6 de Java, j'ai donc créé un AbstractProcessor:

@SupportedAnnotationTypes("com.example.CustomAnnotation")
public class CompileTimeAnnotationProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, 
                           RoundEnvironment roundEnv) {
        Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(CustomAnnotation.class);
        for(Element e : elements){
            if(!e.getClass().equals(ParticularType.class)){
                processingEnv.getMessager().printMessage(Kind.ERROR,
                     "@CustomAnnotation annotated fields must be of type ParticularType");
            }
        }
        return true;
    }

}

Puis, sur la base des instructions que j'ai trouvé, j'ai créé un dossier META-INF/services et créé un fichier javax.annotation.processing.Processor avec le contenu:

 com.example.CompileTimeAnnotationProcessor

Ensuite, j'ai exporté le projet comme un pot.

Dans un autre projet, j'ai construit un test simple de la classe:

public class TestClass {
    @CustomAnnotation
    private String bar; //not `ParticularType`
}

J'ai configuré le projet Eclipse propriétés comme suit:

  • Ensemble Compilateur Java -> Annotation Processing: "Activer l'annotation processing" et "Activer le traitement de l'éditeur"
  • Ensemble Compilateur Java -> Annotation Processing -> Usine de Chemin d'accès pour inclure mon exporté pot et contrôlée selon avancé que mon pleinement qualifié de la classe s'affiche.

J'ai cliqué sur "appliquer" et Eclipse invite à reconstruire le projet, j'ai frappé d'accord-mais aucune erreur n'est levée, malgré le fait d'avoir le processeur d'annotation.

Où ai-je fait de mal?


J'ai couru ce à l'aide de javac comme

javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java

avec sortie

@CustomAnnotation annoté les champs doivent être de type ParticularType

  • D'abord, le processeur d'annotation de travail avec javac en dehors d'Eclipse?
  • oui, il fonctionne en dehors d'Eclipse avec droit de javac (modifications reflètent cette).
  • Avez-vous vérifié le Journal des Erreurs dans Eclipse (Window > Afficher > Journal d'Erreur dans le cas où vous ne pouvez pas le voir)? Lorsqu'un processeur d'annotation échoue, vous ne pourriez pas obtenir une fenêtre de dialogue avec un message d'erreur, mais vous obtiendrez un message d'erreur affichés dans le journal des erreurs. Vous pouvez également essayer de déboguer votre processeur dans Eclipse par aspersion Messager.printMessage() avec type=NOTE dans votre processeur, car elles montrent dans le journal des erreurs ainsi.
  • Le processeur d'annotation JAR, vous ont construit la ParicularType et CustomAnnotation des catégories? Si non, vous avez peut-être NoClassDefFoundErrors lorsque le processeur est effectivement exécuté dans Eclipse.
  • en fait, l'erreur ne s'afficher dans le Journal des Erreurs, il est un moyen d'obtenir l'erreur d'être soulevées plus haut? Dire, dans la classe de vue de l'éditeur ou au moins sur les "Problèmes" volet?
InformationsquelleAutor Mark Elliot | 2011-07-13