Selain apa yang disarankan orang lain, saya sarankan Anda menulis anotasi yang disesuaikan dan prosesornya dari awal untuk melihat cara kerja anotasi.
Di saya sendiri, misalnya, saya telah menulis anotasi untuk memeriksa apakah metode kelebihan beban dalam waktu kompilasi.
Pertama, buat anotasi bernama Overload
. Anotasi ini diterapkan ke metode jadi saya menganotasinya dengan@Target(value=ElementType.METHOD)
package gearon.customAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)
public @interface Overload {
}
Selanjutnya, buat prosesor yang sesuai untuk menangani elemen yang dianotasi oleh anotasi yang ditentukan. Untuk metode yang diberi anotasi @Overload
, tanda tangannya harus muncul lebih dari satu kali. Atau kesalahan dicetak.
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<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
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<String, Integer> entry: map.entrySet()){
if(entry.getValue() == 1){
processingEnv.getMessager().printMessage(Kind.ERROR, "The method which signature is " + entry.getKey() + " has not been overloaded");
}
}
return true;
}
}
Setelah memaketkan anotasi dan prosesnya menjadi file jar, buat kelas dengan @Overload
dan gunakan javac.exe untuk mengkompilasinya.
import gearon.customAnnotation.Overload;
public class OverloadTest {
@Overload
public static void foo(){
}
@Overload
public static void foo(String s){
}
@Overload
public static void nonOverloadedMethod(){
}
}
Karena nonOverloadedMethod()
belum benar-benar kelebihan beban, kita akan mendapatkan keluaran seperti di bawah ini: