Tôi muốn nhận tất cả các phương thức của một lớp, bao gồm các phương thức công cộng, được bảo vệ, gói và riêng và bao gồm cả các phương thức kế thừa.Cách mới để nhận tất cả các phương thức của một lớp, bao gồm các phương thức mặc định kế thừa của Java 8 là gì?
Hãy nhớ rằng:
Class.getDeclaredMethods()
bị công cộng, bảo vệ, đóng gói và phương pháp riêng, nhưng không bao gồm kế thừa phương pháp.Class.getMethods
là các phương pháp được kế thừa, nhưng chỉ các phương thức công khai.
Trước Java 8 chúng ta có thể làm điều gì đó dọc theo dòng:
Collection<Method> found = new ArrayList<Method>();
while (clazz != null) {
for (Method m1 : clazz.getDeclaredMethods()) {
boolean overridden = false;
for (Method m2 : found) {
if (m2.getName().equals(m1.getName())
&& Arrays.deepEquals(m1.getParameterTypes(), m2
.getParameterTypes())) {
overridden = true;
break;
}
}
if (!overridden) found.add(m1);
}
clazz = clazz.getSuperclass();
}
return found;
Nhưng bây giờ, nếu các lớp thực hiện một số giao diện với phương pháp mặc định mà không được ghi đè bởi superclasses bê tông, các phương pháp này sẽ thoát khỏi phát hiện trên. Bên cạnh đó, hiện nay có các quy tắc liên quan đến các phương thức mặc định có cùng tên và các quy tắc này cũng phải được xem xét.
Câu hỏi: cách khuyến cáo hiện tại của nhận tất cả method của một class là gì:
Định nghĩa phổ biến nhất của "tất cả" nên là phương pháp có thể được truy cập trực tiếp bên trong một phương pháp thể hiện của lớp học, mà không cần sử dụng super
hoặc tên lớp:
- Bao gồm các phương thức công khai, được bảo vệ, gói và riêng tư được khai báo trong chính lớp đó.
- Bao gồm các phương thức được bảo vệ của các siêu lớp của nó.
- Bao gồm các phương thức gói của các siêu lớp của cùng một gói.
- Bao gồm các phương pháp mặc định của giao diện của nó (những giao diện không bị ghi đè/ẩn, xem here và here).
- Bao gồm các phương thức tĩnh (lớp và siêu lớp) với khả năng truy cập thích hợp.
- Không bao gồm các phương thức riêng của siêu lớp.
- Không bao gồm các phương pháp ghi đè.
- Không bao gồm các phương thức ẩn (đặc biệt, không bao gồm các phương thức tĩnh ẩn).
- Không bao gồm các phương pháp tổng hợp/cầu.
- Không bao gồm các phương thức không được Java cho phép, ngay cả khi JVM cho phép chúng.
Vì vậy, định nghĩa ở trên phù hợp với chữ ký sau khi cả hai cờ boolean là false
:
public Collection<Method> getAllMethods(Class clazz,
boolean includeAllPackageAndPrivateMethodsOfSuperclasses,
boolean includeOverridenAndHidden)
Các lý tưởng, câu trả lời kinh điển, nên cho phép những lá cờ boolean.
Bạn có chắc chắn rằng cách nhận tất cả các phương pháp của một lớp đã hoạt động cho đến khi java 7 không còn đủ nữa? Bạn có một ví dụ mà nó không? –
@MikeNakis, hãy tự mình thử. Các phương thức mặc định (không triển khai ghi đè) sẽ không hiển thị. – aioobe
tốt, họ không thực sự tuyên bố phương pháp, vì vậy tôi sẽ không mong đợi getDeclartedMethods() để lấy chúng, nhưng không getMethods() lấy chúng? –