2011-12-01 17 views
6

Tôi hiện đang tập trung vào một dự án yêu cầu thông tin chi tiết về mã byte Java.Cách xác định phương pháp ghi đè trong mã byte Java?

Với sự trợ giúp của bcel, giờ đây tôi có thể hoàn thành hầu hết công việc. Một điểm mà bây giờ tôi không rõ ràng là làm thế nào để xác định một phương thức lớp con ghi đè mã cơ sở của nó? Có bất kỳ thuộc tính nào được ghi trong tệp .class được kết hợp với một phương thức chỉ ra mối quan hệ trọng số này hay tôi nên quay lại lớp cơ sở của nó có thể so sánh chữ ký phương thức?

Mọi gợi ý sẽ được đánh giá cao.

Trả lời

5

Bạn cần tra cứu chuỗi phân cấp - không có gì trong mã byte cho biết đó là phương thức ghi đè, vì không cần phải có.

+0

Tại sao không cần thiết? Sau đó, JVM liên kết tệp '.class' khác nhau như thế nào? Liệu nó tìm kiếm hệ thống phân cấp vốn có dưới cùng, cho đến khi nó tìm thấy một phương thức phù hợp? Cảm ơn. –

+1

@Summer_More_More_Tea Lật câu hỏi - tại sao * sẽ * cần thiết? Nếu đó là một phương thức của lớp bạn đang xem, tại sao VM cần phải biết nó được ghi đè? –

+0

@DAVE âm thanh mặt đất. :) Cảm ơn. –

-1

Bạn có thể dịch ngược lại và tải mã dưới dạng dự án trong IDE bạn chọn. Thông thường, bạn có thể dễ dàng chuyển sang các phương thức ghi đè từ lớp kế thừa.

+0

Cảm ơn phản hồi nhanh của bạn. Nhưng làm thế nào để đạt được điều này với mã Java? :) –

2

Nếu bạn không thể dựa vào thuộc tính @Override thì có vẻ như theo the spec không có cách nào khác để biết bằng cách chỉ nhìn vào lớp học. Tôi nghĩ bạn cần phải nhìn vào các siêu lớp.

+4

'@ Ghi đè' có tỷ lệ giữ lại [SOURCE] (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/RetentionPolicy.html#SOURCE). –

+0

@ DᴀᴠᴇNᴇᴡᴛᴏɴ: Cảm ơn. – opqdonut

+0

@DAVE +1. cũng nhờ opqdonut cho trả lời. –

2

Thật không may, bạn không thể biết điều đó từ mã byte. Chú thích @Override chỉ là một lời khuyên - nó không bắt buộc.

JVM định nghĩa 5 cách gọi phương thức. Chúng là invokevirtual, invokeinterface, invokespecial, invokestatic và invokedynamic mới.

Tập trung vào invokevirtual - đó là hình thức phổ biến nhất của công văn và là một trong những được sử dụng cho các trường hợp bạn đang nói về ở đây.

Cách mà công cụ ảo hóa hoạt động là khi chạy, nó nhìn vào lớp của đối tượng bạn đang gửi đi. Nếu nó tìm thấy một thực hiện của phương pháp chúng tôi đang sau, sau đó nó gọi nó. Nếu không, sau đó nó nhìn vào lớp cha của lớp của đối tượng và cố gắng một lần nữa, và như vậy.

Vì vậy, không có cách nào từ bytecode cho biết một cách đáng tin cậy cho dù một phương pháp nhất định được ghi đè, mà không nhìn vào bytecode cho lớp cha.

0

Mã byte được tạo sau khi biên dịch. Vì vậy, nó chỉ giả định phương thức được gọi dựa trên biến tham chiếu, vì đối tượng chưa được tạo.

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