Có thể kế thừa một lớp cuối cùng bằng cách sử dụng các thao tác bytecode không?Có thể kế thừa một lớp cuối cùng sửa đổi bytecode bằng cách nào đó không?
Trả lời
Có và không.
Bạn có thể sử dụng thao tác bytecode để thay đổi lớp final
thành không phải final
khi đang di chuyển. Điều này thậm chí không phá vỡ khả năng tương thích nhị phân, do đó, không có nguy cơ của trình nạp lớp/lỗi xác minh.
Tuy nhiên, bạn phải áp dụng sửa đổi bytecode cho chính lớp học final
. Bạn không thể thực hiện thao tác bytecode trên lớp con để làm cho nó kế thừa từ lớp cha mẹ final
. Hoặc chính xác hơn, nếu bạn làm điều đó, lớp con đã sửa đổi sẽ bị từ chối bởi trình xác minh khi được nạp cùng với lớp cha mẹ final
.
Nếu bạn muốn tham chiếu cụ thể - JVMS mục 4.1, trang 73 - "Không phải lớp siêu trực tiếp cũng như bất kỳ lớp nào trong số các lớp siêu hạng của nó có thể có cờ ACC_FINAL được đặt trong mục access_flags của cấu trúc ClassFile ." – Antimony
JLS cũng đề cập đến điều này - http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.2 –
Nhưng câu hỏi được hỏi về thao tác bytecode, trong trường hợp này JLS không liên quan. Ngôn ngữ Java có vô số các hạn chế tùy ý không có mặt ở mức mã byte. – Antimony
This mô tả định dạng tệp lớp học. Tại offset 10+cpsize
có 2 byte xác định cờ truy cập của lớp này. Một trong những cờ này được gọi là ACC_FINAL (0x0010). Tôi cho rằng bạn có thể che giấu bit đó ra và làm cho lớp đó không phải là cuối cùng.
- 1. Không thể tham khảo/sửa đổi biến không phải cuối cùng trong một lớp bên trong
- 2. Sửa đổi biến thừa kế lớp trong Python
- 3. Jackson + Tomcat - java.lang.VerifyError: Không thể kế thừa từ lớp cuối cùng
- 4. Có thể hai trang ASPX kế thừa cùng một mã phía sau lớp không?
- 5. Không thể truyền một lớp có nhiều thừa kế
- 6. Thừa kế các trường cuối cùng trong Java?
- 7. Có thành phần nào không thể thực hiện được thừa kế đó không?
- 8. Bao gồm một lớp không thể kế thừa trong C#
- 9. Có thể bytecode của một lớp thay đổi nếu một lớp cha/giao diện thay đổi?
- 10. Lớp kế thừa C++ có thành viên cùng tên
- 11. Tạo một lớp không được thừa kế
- 12. Có thể cho lớp kế thừa annotaions của lớp siêu
- 13. Đu và sửa đổi cuối cùng
- 14. Làm cách nào để kiểm tra xem một lớp có kế thừa lớp khác mà không khởi tạo lớp đó không?
- 15. Chế nhạo một lớp kế thừa từ một lớp khác
- 16. Một python @classmethod có thể được kế thừa không?
- 17. Haskell lớp kế thừa kiểu
- 18. Trong C hoặc C++, có cách nào để mở rộng một lớp không thừa kế không?
- 19. Thừa kế lớp bảng giáo lý khi một lớp con không có thuộc tính phụ
- 20. Có cách nào để hạn chế ai có thể kế thừa một lớp hoặc giao diện không?
- 21. Thừa kế tài liệu trong kế thừa lớp Python
- 22. C# Thừa kế lớp
- 23. Phương pháp cuối cùng có thể sử dụng Powermockito trong lớp bê tông không cuối cùng?
- 24. Biến thể hiện lớp Ruby và thừa kế
- 25. Tôi có thể xác định yêu cầu giao diện/phụ thuộc/kế thừa kế thừa không?
- 26. Tại sao tôi không thể kế thừa các lớp tĩnh?
- 27. Có thể trong SASS để kế thừa từ một lớp trong một tệp khác không?
- 28. Có thể kế thừa từ MKPolyline
- 29. Có thể phát hiện ngữ cảnh lớp trong một phương thức tĩnh được kế thừa không?
- 30. Virtualenv có thể kế thừa từ chương trình khác không?
Sẽ không "thành phần thay vì thừa kế" giải quyết vấn đề của bạn? Bạn có thể sử dụng lớp trình bao bọc cho những gì bạn đang cố gắng làm không? Xin vui lòng gửi một số chi tiết, rất khó để tư vấn cho một cái gì đó nếu số lượng thông tin rất nhỏ có sẵn ... (và vikingsteve là đúng!) – ppeterka
'final' thường có một lý do ... – vikingsteve
Lớp học nào bạn đang cố gắng Kế thừa từ? Một trong những thư viện chuẩn? –