นอกเหนือจากสิ่งที่คนอื่นแนะนำฉันขอแนะนำให้คุณเขียนคำอธิบายประกอบที่กำหนดเองและตัวประมวลผลตั้งแต่ต้นเพื่อดูว่าคำอธิบายประกอบทำงานอย่างไร
ตัวอย่างเช่นในตัวของฉันเองฉันได้เขียนคำอธิบายประกอบเพื่อตรวจสอบว่าเมธอดนั้นโอเวอร์โหลดหรือไม่ในเวลาคอมไพล์
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;
}
}
หลังจากบรรจุคำอธิบายประกอบและกระบวนการลงในไฟล์ jar แล้วให้สร้างคลาสด้วย@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()
ไม่ได้รับการโหลดมากเกินไปเราจะได้ผลลัพธ์ดังนี้: