2012-05-09 25 views
6

Trong khi tạo các lớp học bằng cách sử dụng Generators, bạn có thể khám phá tất cả các lớp con của một loại. Bạn có thể tìm thấy kỹ thuật này ví dụ như trong các nguồn Showcase GWT (xem full code):Có thể tìm tất cả các lớp được chú thích bằng @MyAnnotation bằng GWT GeneratorContext không?

JClassType cwType = null; 
try { 
    cwType = context.getTypeOracle().getType(ContentWidget.class.getName()); 
} catch (NotFoundException e) { 
    logger.log(TreeLogger.ERROR, "Cannot find ContentWidget class", e); 
    throw new UnableToCompleteException(); 
} 
JClassType[] types = cwType.getSubtypes(); 

Tôi muốn làm điều gì đó tương tự, nhưng thay vì mở rộng một lớp (hoặc thực hiện một giao diện)

public class SomeWidget extends ContentWidget { ... } 

, tôi có thể thực hiện điều này bằng cách chú thích Tiện ích không?

@MyAnnotation(...) 
public class SomeWidget extends Widget { ... } 

Và sau đó tìm tất cả các Widget được chú thích bằng @MyAnnotation? Tôi không thể tìm thấy một phương pháp như JAnnotationType.getAnnotatedTypes(), nhưng có lẽ tôi chỉ mù?

Lưu ý: tôi đã có thể làm cho nó làm việc với các thư viện Google Reflections, sử dụng reflections.getTypesAnnotatedWith(SomeAnnotation.class), nhưng tôi muốn sử dụng GeneratorContext thay vào đó, đặc biệt là bởi vì này làm việc tốt hơn rất nhiều khi tải lại ứng dụng trong devmode.

Trả lời

8

Có - cách dễ nhất là lặp qua tất cả các loại và kiểm tra chú thích cho chú thích. Bạn cũng có thể có các quy tắc khác (công khai, không trừu tượng) cũng nên được thực hiện tại thời điểm đó.

for (JClassType type : oracle.getTypes()) { 
    MyAnnotation annotation = type.getAnnotation(MyAnnotation.class); 
    if (annotation != null && ...) { 
    // handle this type 
    } 
} 

Các TypeOracle dụ có thể được lấy từ GeneratorContext sử dụng context.getTypeOracle().

Lưu ý rằng thao tác này sẽ chỉ cấp cho bạn quyền truy cập vào các loại trên đường dẫn nguồn. Tức là, chỉ các loại hiện có sẵn dựa trên các mô-đun được kế thừa và <source> thẻ đang được sử dụng.

+0

+1, điều đó chắc chắn hoạt động và tôi không xem xét phương pháp này. Đó là một cách bạo lực (không quan trọng quá nhiều vì sẽ không có hàng triệu loại). Tôi sẽ sẵn sàng chấp nhận câu trả lời của bạn, nếu không có giải pháp được xác định trước cho điều này. –

+0

Nó cảm thấy sức mạnh vũ phu từ quan điểm của hầu hết Java, nhưng chỉ trong đường dẫn nguồn, nó sẽ không quá tệ. Ngoài ra, đó là những gì mà hàm trong thư viện Google Reflections cũng sẽ phải làm - tìm và xem tất cả các lớp hiện có trên classpath. –

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