Je pense qu'une annotation personnalisée, qui sera traitée par le compilateur, est la solution. J'écris fréquemment des annotations personnalisées pour faire des choses au moment de l'exécution, mais je n'ai jamais essayé de les utiliser au moment de la compilation. Je ne peux donc que vous donner des indications sur les outils dont vous pourriez avoir besoin :
- Écrire un type d'annotation personnalisé. Cette page explique comment écrire une annotation.
- Écrivez un processeur d'annotation, qui traite votre annotation personnalisée pour émettre un avertissement. L'outil qui exécute de tels processeurs d'annotation est appelé APT. Vous pouvez trouver une introduction sur cette page . Je pense que ce dont vous avez besoin dans l'API APT est AnnotationProcessorEnvironment, qui vous permettra d'émettre des avertissements.
- A partir de Java 6, APT est intégré dans javac. C'est-à-dire que vous pouvez ajouter un processeur d'annotation dans la ligne de commande javac. Cette section du manuel javac vous indiquera comment appeler votre processeur d'annotation personnalisé.
Je ne sais pas si cette solution est vraiment praticable. J'essaierai de la mettre en œuvre moi-même lorsque je trouverai un peu de temps.
Modifier
J'ai réussi à mettre en œuvre ma solution. Et en bonus, j'ai utilisé la fonction de fournisseur de service de java pour simplifier son utilisation. En fait, ma solution est un jar qui contient 2 classes : l'annotation personnalisée et le processeur d'annotation. Pour l'utiliser, il suffit d'ajouter ce jar dans le classpath de votre projet, et d'annoter ce que vous voulez ! Cela fonctionne parfaitement dans mon IDE (NetBeans).
Code de l'annotation :
package fr.barjak.hack;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface Hack {
}
Code du processeur :
package fr.barjak.hack_processor;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
@SupportedAnnotationTypes("fr.barjak.hack.Hack")
public class Processor extends AbstractProcessor {
private ProcessingEnvironment env;
@Override
public synchronized void init(ProcessingEnvironment pe) {
this.env = pe;
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (!roundEnv.processingOver()) {
for (TypeElement te : annotations) {
final Set< ? extends Element> elts = roundEnv.getElementsAnnotatedWith(te);
for (Element elt : elts) {
env.getMessager().printMessage(Kind.WARNING,
String.format("%s : thou shalt not hack %s", roundEnv.getRootElements(), elt),
elt);
}
}
}
return true;
}
}
Pour activer le jar résultant en tant que fournisseur de services, ajoutez le fichier META-INF/services/javax.annotation.processing.Processor
dans le jar. Ce fichier est un fichier acsii qui doit contenir le texte suivant :
fr.barjak.hack_processor.Processor
1 votes
FYI : le @Deprecated ne donne qu'un compilateur avertissement et non une erreur de compilation ou d'exécution. Le code devrait s'exécuter
0 votes
Essayez de l'exécuter avec javac directement. Je pense que Ant cache une partie de la sortie. Ou voyez ma réponse mise à jour ci-dessous pour plus de détails.