दूसरों ने जो सुझाव दिया है, इसके अलावा, मैं आपको एक एनोटेशन लिखने और उसके प्रोसेसर को स्क्रैच से देखने की सलाह देता हूं कि एनोटेशन कैसे काम करता है।
अपने आप में, उदाहरण के लिए, मैंने यह जांचने के लिए एक एनोटेशन लिखा है कि क्या संकलन समय में तरीके अतिभारित हैं।
सबसे पहले, नाम का एक एनोटेशन बनाएं Overload
। इस एनोटेशन को विधि के लिए लागू किया जाता है इसलिए मैं इसके साथ एनोटेट करता हूं@Target(value=ElementType.METHOD)
package gearon.customAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)
public @interface Overload {
}
अगला, परिभाषित एनोटेशन द्वारा एनोटेट किए गए तत्वों को संभालने के लिए संबंधित प्रोसेसर बनाएं। द्वारा एनोटेट की गई विधि के लिए @Overload
, इसके हस्ताक्षर को एक से अधिक बार प्रदर्शित होना चाहिए। या त्रुटि छपी है।
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;
}
}
पैकेजिंग एनोटेशन और इसकी प्रक्रिया को जार फ़ाइल में रखने के बाद, @Overload
इसे संकलित करने के लिए javac.exe के साथ एक वर्ग बनाएं और उपयोग करें।
import gearon.customAnnotation.Overload;
public class OverloadTest {
@Overload
public static void foo(){
}
@Overload
public static void foo(String s){
}
@Overload
public static void nonOverloadedMethod(){
}
}
चूंकि nonOverloadedMethod()
वास्तव में अतिभारित नहीं किया गया है, इसलिए हमें नीचे जैसा आउटपुट मिलेगा: