2011-10-12 27 views
6

Khi có bộ xử lý chú thích TypeElement, bạn có thể yêu cầu cấp siêu hạng (hoặc cụ thể hơn là TypeMirror của nó) bằng phương pháp getSuperClass(). According to the JavaDoc, loại không bùng nổ mở rộng bất kỳ thứ gì (nói cách khác, Object là lớp siêu) hoặc đó là giao diện sẽ trả về một số NoType với NONETypeKind.Kiểm tra sự vắng mặt của siêu lớp trong bộ xử lý chú thích

Bỏ qua thực tế rằng toàn bộ mô hình/gương điều API dường như đi ra khỏi con đường của nó để gây nhầm lẫn bạn tại mọi cơ hội trong một thời điểm, làm thế nào tôi sẽ kiểm tra đáng tin cậy cho điều này? Dưới đây là một số chiết xuất mã:

//Cast is safe since TypeKind is checked before this 
final TypeElement el = (TypeElement)annotatedElement; 
... 
final TypeMirror parent = el.getSuperclass(); 
//Checking whether "nothing" is extended 
if(parent.getKind().equals(TypeKind.NONE) && parent instanceof NoType) { 
    ...   
} 

Đây có phải là cách thích hợp không? Nó có vẻ khá clunky. Vì không nên sử dụng equals method of TypeMirror để kiểm tra bình đẳng ngữ nghĩa, tôi tự hỏi liệu có an toàn không khi sử dụng nó cho TypeKind. Cảm giác ruột của tôi nói có vì nó là một enum, nhưng sau đó tôi có nghi ngờ về điều đó instanceof.

Có cách nào tốt hơn để thực hiện việc này không? Toàn bộ gói javax.lang.model và các con của nó có tham chiếu chéo trên tất cả các cửa hàng và nó không bao giờ thực sự rõ ràng đối với tôi phương pháp tốt nhất cho cái gì đó là gì. Có những phương pháp tiện ích hữu ích cho một số công cụ, và sau đó có những nhiệm vụ dường như đơn giản đòi hỏi nhào lộn đáng ngờ như trên.

Trả lời

8

Tôi vừa thực hiện kiểm tra và nhận ra rằng tôi đã hiểu sai tài liệu. Nó trả về một NoType với loại NONE cho java.lang.Object và các giao diện, không phải cho một cái gì đó ngầm mở rộng Object. Tôi ngớ ngẩn quá. Tôi sẽ không cần phải kiểm tra từ một sớm một kiểm tra nếu các yếu tố được chú thích là một lớp học theo nghĩa hẹp (không phải là một enum hoặc giao diện) và sẽ trở lại nếu như vậy. Nói cách khác, kiểm tra nếu tên kinh điển là java.lang.Object hoặc có thể sử dụng Types.isSameType nên làm các trick.

folks Xin lỗi. Tôi đã quyết định không xóa vì những người khác có thể đến với cùng một câu hỏi. Vui lòng bỏ phiếu nếu bạn cho rằng nó phù hợp.

EDIT: Đây là những gì tôi cuối cùng đã đi với ...

boolean superTypeValid = true; 
final TypeMirror parent = el.getSuperClass(); 
if(!parent.getKind().equals(TypeKind.DECLARED)) { 
    messager.printMessage(Kind.ERROR, "May only inherit from a class; not enums, annotations or other declared kinds.", annotatedElement, mirror); 
    superTypeValid = false; 
} else { 
    final DeclaredType parentType = (DeclaredType)parent; 
    final Element parentEl = parentType.asElement(); 
    if(!parentEl.getKind().equals(ElementKind.CLASS)) { 
     messager.printMessage(Kind.ERROR, "May only inherit from a class; not enums, annotations or other declared kinds.", annotatedElement, mirror); 
     superTypeValid = false; 
    } 
} 
... 
if(superTypeValid) { 
    if(typeUtils.isSameType(parent, elUtils.getTypeElement("java.lang.Object").asType())) { 
     messager.printMessage(Kind.ERROR, "Inherit must not be set to true if the class doesn't extend.", annotatedElement, mirror); 
     valid = false; 
    } else { 
     ... 
    } 
} 

Nếu một số những thông báo lỗi có vẻ kỳ lạ, đó là vì tôi rời một số nội dung dự án cụ thể ra.

Các vấn đề liên quan