Bên cạnh những gì người khác đề xuất, tôi khuyên bạn nên viết chú thích tùy chỉnh và bộ xử lý của nó từ đầu để xem chú thích hoạt động như thế nào.
Ví dụ, tôi đã viết chú thích để kiểm tra xem các phương thức có bị quá tải trong thời gian biên dịch hay không.
Trước hết, hãy tạo chú thích có tên Overload
. chú thích này được áp dụng cho phương pháp vì vậy tôi chú thích nó với @Target(value=ElementType.METHOD)
package gearon.customAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)
public @interface Overload {
}
Tiếp theo, tạo bộ vi xử lý tương ứng để xử lý các yếu tố chú thích bằng cách chú thích định nghĩa. Đối với phương thức được chú thích bởi @Overload
, chữ ký của nó phải xuất hiện nhiều lần. Hoặc lỗi được in.
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) {
// TODO Auto-generated method stub
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;
}
}
Sau khi đóng gói chú thích và quy trình vào tệp jar, hãy tạo lớp học với @Overload
và sử dụng javac.exe để biên dịch 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(){
}
}
Kể từ nonOverloadedMethod()
chưa thực sự được quá tải, chúng tôi sẽ nhận được đầu ra như dưới đây:
Ý anh là gì bằng cách "làm việc trong nội bộ"? Trình biên dịch? Thời gian chạy? – chrylis
@chrylis Làm việc nội bộ có nghĩa là cách nó tự động xác định rằng phương pháp này là phương pháp ghi đè hoặc phương pháp này không phải là phương pháp ghi đè. Nó hoạt động trên cả hai thời gian. giống như ghi đè chú thích làm việc trong thời gian biên dịch và chú thích bộ điều khiển lò xo hoạt động trong thời gian chạy –