Outre ce que d'autres ont suggéré, je vous recommande d'écrire une annotation personnalisée et son processeur à partir de zéro pour voir comment fonctionne l'annotation.
Dans mon cas, par exemple, j'ai écrit une annotation pour vérifier si les méthodes sont surchargées au moment de la compilation.
Tout d'abord, créez une annotation nommée Overload
. Cette annotation est appliquée à la méthode donc je l'annote avec @Target(value=ElementType.METHOD)
package gearon.customAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)
public @interface Overload {
}
Ensuite, créez un processeur correspondant pour gérer les éléments annotés par l'annotation définie. Pour la méthode annotée par @Overload
, sa signature doit apparaître plus d'une fois. Sinon une erreur est affichée.
package gearon.customAnnotation;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
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("gearon.customAnnotation.Overload")
public class OverloadProcessor extends AbstractProcessor{
@Override
public boolean process(Set annotations, RoundEnvironment roundEnv) {
// TODO Auto-generated method stub
HashMap map = new HashMap();
for(Element element : roundEnv.getElementsAnnotatedWith(Overload.class)){
String signature = element.getSimpleName().toString();
int count = map.containsKey(signature) ? map.get(signature) : 0;
map.put(signature, ++count);
}
for(Entry entry: map.entrySet()){
if(entry.getValue() == 1){
processingEnv.getMessager().printMessage(Kind.ERROR, "La méthode dont la signature est " + entry.getKey() + " n'a pas été surchargée");
}
}
return true;
}
}
Après avoir empaqueté l'annotation et son processeur dans un fichier jar, créez une classe avec @Overload
et utilisez javac.exe pour la compiler.
import gearon.customAnnotation.Overload;
public class OverloadTest {
@Overload
public static void foo(){
}
@Overload
public static void foo(String s){
}
@Overload
public static void nonOverloadedMethod(){
}
}
Comme la méthode nonOverloadedMethod()
n'a pas été effectivement surchargée, nous obtiendrons une sortie comme ci-dessous: