2012-03-12 28 views
5

Tôi cần thực hiện một số quy trình để xác định các phụ thuộc của các lớp được chú thích JSR-330, sử dụng sự phản chiếu.Java: Cách kiểm tra xem một phương pháp có bị ghi đè hay không, sử dụng phản chiếu

Tôi hoàn toàn nhận thức được tất cả các thùng chứa IoC tuân thủ JSR-330, như Spring, Guice hoặc PicoContainer. Tuy nhiên, những gì tôi cần không phải là để giải quyết và tiêm phụ thuộc, nhưng để xác định chúng.

Điều đó về cơ bản có nghĩa là tôi cần triển khai thực hiện JSR-330, ít nhất là khi nói đến lớp phân tích "phân tích cú pháp".

Có một phần của đặc tả JSR-330 mà tôi thấy hơi phiền hà để thực hiện:

Một phương pháp chú thích với @Inject đó sẽ ghi đè một phương pháp chú thích với @Inject sẽ chỉ được tiêm một lần mỗi tiêm Yêu cầu mỗi trường hợp. Phương thức không có chú thích @Inject rằng ghi đè phương thức được chú thích bằng @Inject sẽ không được chèn.

Điều đó có nghĩa là các lớp con có thể xác định lại hợp đồng tự động của lớp cơ sở của chúng, cũng như móc vào luồng phun (thông qua đa hình).

Dưới đây là câu hỏi của tôi: Với hệ thống phân cấp lớp, có cách dễ dàng để kiểm tra xem một phương pháp tại một số phần của cấu trúc phân cấp có bị ghi đè sâu hơn không?

Cách đơn giản nhất tôi sẽ làm điều này trong trường hợp của tôi là với đệ quy từ lá của hệ thống phân cấp:

private List<Method> getInjectableMethods(final Class<?> clazz) { 
    // recursive stop condition 
    if(clazz == null) { 
     return emptyList(); 
    } 

    // recursively get injectable methods from superclass 
    final List<Method> allInjectableMethods = newLinkedList(getInjectableMethods(clazz.getSuperclass())); 
    final List<Method> injectableMethods = newArrayList(); 

    // any overridden method will be present in the final list only if it is injectable in clazz 
    for (final Method method : clazz.getDeclaredMethods()) { 
     removeIf(allInjectableMethods, Methods.Predicates.overriddenBy(method)); 
     if (isInjectable(method)) { 
      injectableMethods.add(method); 
     } 
    } 
    allInjectableMethods.addAll(injectableMethods); 

    return allInjectableMethods; 
} 

Đối với overriddenBy ổi giống như Predicate, tôi sẽ kiểm tra xem:

  • Các phương pháp xác định các lớp học trong một isAssignableTừ quan hệ
  • Tên phương thức là giống nhau
  • Phương thức chính thức param eters là giống nhau

Kết quả phức tạp là O (n^2) liên quan đến số phương pháp trong cấu trúc phân cấp.

Tôi đã tự hỏi liệu có cách nào đó dễ dàng hơn hoặc hiệu quả hơn để đạt được nó hay bất kỳ thư viện nào có chức năng như vậy. Tôi đã không thành công trong cả hai nhãn hiệu ổi và Apache ...

+0

Google Reflections có thể? http://code.google.com/p/reflections/ – biziclop

+0

Tôi đã xem qua các javadocs và không tìm thấy bất kỳ thứ gì để kiểm tra ghi đè phương thức. Thư viện đẹp mặc dù, tôi sẽ giữ nó trong tâm trí! – Eleaar

+0

Tại tồi tệ nhất nó sẽ làm cho việc thực hiện thuật toán của bạn dễ dàng hơn.:) – biziclop

Trả lời

1

Thật không may, biểu đồ lớp chỉ có thể điều hướng được - vì vậy không có cách nào để tìm tất cả các lớp dẫn xuất ngoại trừ kiểm tra tất cả các lớp có sẵn cho trình nạp lớp nhất định. IoC container không có vấn đề này, bởi vì họ luôn luôn biết thực hiện cụ thể (nó là một phần của cấu hình)

Cây thừa kế thường được xây dựng bởi IDE, nhưng AFAIUK sử dụng lập chỉ mục lực lượng brite trên tất cả các nguồn/lớp có sẵn (bạn có thể xem xét các nguồn chỉnh sửa cộng đồng của InteliiJ IDEA cho các đầu mối)

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