Có cách nào để ghi đè lên một phương thức tại thời gian chạy không? ngay cả khi nó yêu cầu tạo động một lớp con từ cá thể đó?là nó có thể ghi đè lên một phương pháp trong thời gian chạy?
Trả lời
Với Java thuần túy, không.
Với asm hoặc cglib hoặc aspectj, có.
Trong Java đơn giản, điều cần làm trong một tình huống như thế là tạo một interface-based proxy xử lý lời gọi phương thức và ủy quyền cho đối tượng gốc (hoặc không).
Ý bạn là một cái gì đó như thế này: http://cglib.sourceforge.net/apidocs/net/sf/cglib/Enhancer.html
Tôi nghĩ rằng không thể với Java đơn giản. Với sự phản ánh và/hoặc cglib, bạn có thể làm điều đó.
Nhìn vào những liên kết này:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
Bạn có thể tạo một anonymous class đó sẽ ghi đè phương pháp và sử dụng strategy pattern quyết định phải làm gì.
Nếu bạn đang tìm kiếm tổng hợp động từ mã, bạn có thể làm theo these instructions
Btw, tôi đã sử dụng trình biên dịch động để triển khai khung kiểm thử theo kịch bản .NET. Tôi đọc một kịch bản C# và soạn một lớp: "public class Test {public void Method() {" + userScript + "}}". Sau đó, tôi chỉ cần xây dựng toàn bộ điều và được gọi là "Test.Method" bằng cách sử dụng phản ánh giống như trong liên kết tôi đã gửi. –
Như những người khác nói, không, bạn không thể ghi đè lên một phương pháp khi chạy. Tuy nhiên, bắt đầu với Java 8 bạn có thể sử dụng phương pháp chức năng. Function
là giao diện chức năng cho phép bạn xử lý các chức năng dưới dạng loại tham chiếu. Điều này có nghĩa là bạn có thể tạo một vài cái và chuyển đổi giữa chúng (động) một mẫu chiến lược a la.
Hãy xem xét một ví dụ:
public class Example {
Function<Integer, Integer> calculateFuntion;
public Example() {
calculateFuntion = input -> input + 1;
System.out.println(calculate(10));
// all sorts of things happen
calculateFuntion = input -> input - 1;
System.out.println(calculate(10));
}
public int calculate(int input) {
return calculateFuntion.apply(input);
}
public static void main(String[] args) {
new Example();
}
}
Output:
Tôi không biết trong hoàn cảnh nào và thiết kế bạn có ý định để ghi đè lên, nhưng quan điểm là bạn thay thế hành vi của phương pháp, đó là những gì ghi đè.
- 1. Khó hiểu "ghi đè lên một phương pháp riêng"
- 2. có thể đánh dấu phương thức ghi đè là
- 3. Tìm phương pháp ghi đè
- 4. Làm rõ phương pháp ghi đè lên trộn bằng Ruby
- 5. Sử dụng Groovy metaclass ghi đè lên phương pháp
- 6. Có cách nào trong C# để ghi đè lên một phương thức lớp với một phương pháp mở rộng?
- 7. là nó có thể quá tải một phương pháp cuối cùng
- 8. Có thể ghi đè lên một phương thức tĩnh trong lớp dẫn xuất không?
- 9. Các phương pháp ghi đè trong JavaDoc
- 10. Tôi có thể ghi đè lên @RequestMapping trên một kiểu cho một phương thức không?
- 11. Ghi đè bằng phương pháp trong DTO's
- 12. Làm thế nào để ghi đè lên một phương pháp variadic trong Objective-C
- 13. Xác định nếu một phương pháp Objective-C là variadic trong thời gian chạy
- 14. Nó được gọi là gì khi bạn ghi đè lên một phương thức trong khi gọi một hàm tạo?
- 15. ghi đè khi chạy __setattr__
- 16. Tôi có thể sử dụng phương pháp ghi đè phương pháp phi ảo không?
- 17. ghi đè phương pháp ảo C++
- 18. Gọi một phương pháp ghi đè từ một constructor
- 19. Phản ánh Java: Làm cách nào để ghi đè hoặc tạo phương thức trong thời gian chạy?
- 20. Java: Gọi một phương pháp siêu trong đó kêu gọi một phương pháp ghi đè
- 21. ghi đè lên một phương thức cho một thể hiện của một lớp?
- 22. Ghi đè phương pháp được bảo vệ
- 23. Điều gì xảy ra nếu hai danh mục ObjC ghi đè lên cùng một phương pháp?
- 24. Các phương pháp danh mục có thể bị ghi đè không? IOS
- 25. "Không thể ghi đè lên các phương pháp cuối cùng từ SherlockActivity"
- 26. Truy vấn phương thức ẩn của NSURLParameters có thể ghi đè lên danh mục
- 27. Ghi đè phương pháp riêng với Reflection
- 28. Groovy có thể tự động thêm hoặc ghi đè lên một phương thức trên POJO không?
- 29. thời gian ra một phương pháp gọi
- 30. Lựa chọn phương pháp có quá tải và ghi đè
Tại sao? Bạn đang cố làm gì vậy? – SLaks
@Maxwell lý do của bạn cho việc muốn làm điều này là gì? Bạn chỉ có thể xác định chi tiết phương pháp tại thời gian chạy? –