অন্যরা যা পরামর্শ দিয়েছে সেগুলি ছাড়াও, টীকাটি কীভাবে কাজ করে তা দেখতে আপনাকে প্রথমে একটি কাস্টমাইজড টিকা রচনা এবং এর প্রসেসরটি স্ক্র্যাচ থেকে লেখার পরামর্শ দিন।
আমার নিজের হিসাবে, উদাহরণস্বরূপ, সংকলন পদ্ধতিতে পদ্ধতিগুলি ওভারলোড করা হচ্ছে কিনা তা পরীক্ষা করার জন্য আমি একটি টীকা লিখেছি।
প্রথমত, নামের একটি টীকা তৈরি করুন 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
এবং এটি সংকলন করতে জাভ্যাক.এক্সই ব্যবহার করুন।
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()
আসলে অতিরিক্ত লোড করা হয়নি, তাই আমরা নীচের মতো আউটপুট পাব: