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 ...
Google Reflections có thể? http://code.google.com/p/reflections/ – biziclop
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
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