Có thể gọi phương thức không có trình sửa đổi trong siêu lớp thông qua phản chiếu Java không?Phương pháp truy cập phản xạ Java với công cụ sửa đổi mặc định trong lớp siêu
Trả lời
Có. Bạn có thể cần gọi setAccessible (true) trên đối tượng Method trước khi bạn gọi nó.
cả getMethod và getDeclaredMethod thất bại nếu được gọi trên lớp con. và setAccessible là không cần thiết. – Bozho
Từ nhận xét đó, tôi đoán bạn đang cố gắng gọi một phương thức với các tham số. Bạn cần xác định những điều này khi tra cứu Phương thức. – Stroboskop
Tôi không phải là OP;) – Bozho
Method method = getClass().getSuperclass().getDeclaredMethod("doSomething");
method.invoke(this);
nếu bạn có một hệ thống phân cấp lớn hơn, bạn có thể sử dụng:
Class current = getClass();
Method method = null;
while (current != Object.class) {
try {
method = current.getDeclaredMethod("doSomething");
break;
} catch (NoSuchMethodException ex) {
current = current.getSuperclass();
}
}
// only needed if the two classes are in different packages
method.setAccessible(true);
method.invoke(this);
(các ví dụ trên là dành cho một phương thức có tên doSomething
không có đối số Nếu phương pháp của bạn có đối số, bạn phải thêm họ. các loại làm đối số cho phương pháp getDeclaredMethod(...)
)
Sẽ không tốt hơn nếu bạn lấy lại 'Method []' bằng cách sử dụng 'getDeclaredMethods()' và kiểm tra xem chúng ta có một tên phương thức khớp với hơn là bắt ngoại lệ không? Không phải là thứ hai khá chậm vì một dấu vết ngăn xếp phải được tạo ra mỗi lần? Hay tôi đang tối ưu hóa sớm? :) –
Stacktraces được tạo ra một cách lười biếng; nếu bạn không yêu cầu, nó không được tạo ra. Bạn có thể kiểm tra điều này bằng cách thiết lập một điểm dừng trong phương thức getOurStacktrace của Throwable và sau đó ném và ngoại lệ. – Ajax
Sau khi đọc câu hỏi gốc - Tôi nhận ra rằng tôi cho rằng bạn đang cố gọi một phương thức ghi đè. Đó là những gì tôi đã cố gắng để làm và làm thế nào tôi đến để tìm chủ đề này. Việc gọi một phương thức không được ghi đè của lớp cơ sở sẽ hoạt động như các phương thức khác ở đây đã mô tả. Tuy nhiên, nếu bạn đang cố gắng gọi một phương pháp ghi đè, câu trả lời của tôi là viết tắt như dưới đây:
Tôi không nghĩ rằng gọi một phương thức ghi đè là có thể, mỗi
http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on
Đáng chú ý nhất:
Method.invoke
Nếu phương thức cơ bản là một phương thức thể hiện, nó được gọi bằng cách sử dụng tra cứu phương pháp động như được ghi trong Đặc tả Ngôn ngữ Java, Ấn bản thứ hai, phần 15.12.4.4; đặc biệt, ghi đè dựa trên kiểu thời gian chạy của đối tượng đích sẽ xảy ra.
- 1. Các công cụ sửa đổi truy cập java và các phương thức ghi đè
- 2. Thay đổi công cụ sửa đổi truy cập của một phương thức ghi đè trong Java?
- 3. việc sử dụng các phương thức công khai khi lớp có trình sửa đổi truy cập mặc định là gì?
- 4. Cách thay đổi công cụ sửa đổi truy cập mặc định trong Resharper (R #) thành nội bộ
- 5. Mục đích của phương pháp này để truy cập các công cụ sửa đổi là gì?
- 6. Các công cụ sửa đổi truy cập có ảnh hưởng đến sự phản chiếu không?
- 7. Sử dụng phản xạ Scala với phản xạ Java
- 8. phương pháp mà không cần sửa đổi truy cập
- 9. Các công cụ sửa đổi truy cập có quan trọng đối với phương thức chính không?
- 10. Công cụ sửa đổi truy cập C# chỉ hiển thị lớp trong không gian tên
- 11. sửa đổi truy cập mặc định cho enum trong C#
- 12. Công cụ sửa đổi truy cập tự động Refactor
- 13. Các công cụ sửa đổi truy cập bên trong một lớp lồng nhau tĩnh riêng trong Java
- 14. Trong Eclipse, làm cách nào để thay đổi các công cụ sửa đổi mặc định trong mẫu kiểu/lớp?
- 15. không thể truy cập vào thành viên của lớp org.springframework.aop.TruePointcut với công cụ sửa đổi công khai
- 16. Truy cập lớp ngoài "siêu" từ lớp bên trong trong Java
- 17. Trình sửa đổi truy cập mặc định của lớp là gì?
- 18. Làm cách nào và ở đâu để sử dụng công cụ sửa đổi tĩnh trong Java?
- 19. Ánh xạ liên kết với siêu lớp được ánh xạ
- 20. Thực hành sửa đổi truy cập tốt nhất trong C# so với Java
- 21. Các lớp lồng ghép Java địa phương và truy cập các phương thức siêu
- 22. Cú pháp và định dạng của trình sửa đổi Java
- 23. Cách thay đổi công cụ sửa đổi truy cập của điều khiển người dùng
- 24. Bộ chỉnh sửa phản xạ và truy cập trên thuộc tính
- 25. bên trong truy cập lớp phương pháp lớp bên ngoài, cùng một phương pháp tên
- 26. Sự khác biệt giữa các thông số truy cập và các công cụ sửa đổi truy cập là gì?
- 27. Resharper - Làm cách nào để tắt công cụ sửa đổi truy cập 'riêng tư'?
- 28. thành viên lớp VB.NET công cộng theo mặc định
- 29. Trình phản xạ cho Java?
- 30. Java: Sử dụng phương pháp lớp cha để truy cập lớp con biến
Lưu ý rằng điều quan trọng là phải xác định xem phương pháp bạn đang cố gắng gọi đã bị ghi đè trong lớp con hay chưa. Bạn có thể gọi phương thức bảo vệ gói (hay còn gọi là truy cập mặc định) thông qua sự phản chiếu không? Vâng. Bạn có thể gọi một phương thức ghi đè thông qua sự phản chiếu không? Không, phương thức ghi đè sẽ được gọi. Các câu trả lời dưới đây đưa ra các giả định khác nhau về vấn đề này. –