2013-02-25 25 views
6

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?

+1

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

+5

'final' thường có một lý do ... – vikingsteve

+0

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? –

Trả lời

4

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.

+0

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

+0

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 –

+0

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

0

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.

Các vấn đề liên quan