Başkalarının önerdiklerinin yanı sıra, ek açıklamanın nasıl çalıştığını görmek için özelleştirilmiş bir açıklama ve işlemcisini sıfırdan yazmanızı öneririm.
Kendi başıma, örneğin, yöntemlerin derleme zamanında aşırı yüklenip yüklenmediğini kontrol etmek için bir açıklama yazdım.
İlk olarak, adlı bir açıklama oluşturun Overload
. Bu ek açıklama yönteme uygulanır, bu yüzden ona ek açıklama yaparım@Target(value=ElementType.METHOD)
package gearon.customAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)
public @interface Overload {
}
Ardından, tanımlı açıklama ile açıklanmış öğeleri işlemek için karşılık gelen işlemciyi oluşturun. İle açıklama eklenen yöntem için @Overload
, imzası birden fazla görünmelidir. Veya hata yazdırılır.
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;
}
}
Ek açıklamayı ve sürecini bir jar dosyasına @Overload
paketledikten sonra, javac.exe ile bir sınıf oluşturun ve onu derlemek için kullanın.
import gearon.customAnnotation.Overload;
public class OverloadTest {
@Overload
public static void foo(){
}
@Overload
public static void foo(String s){
}
@Overload
public static void nonOverloadedMethod(){
}
}
Yana nonOverloadedMethod()
aslında aşırı edilmedi, aşağıda gibi çıktıyı alırsınız: