2013-04-12 36 views
17

Tôi có một phương pháp tĩnh trong một số mã cũ, được nhiều khách hàng gọi. Tôi rõ ràng không có tùy chọn để ghi đè lên nó, hoặc thay đổi hành vi thông qua tiêm phụ thuộc. Tôi không được phép sửa đổi lớp hiện tại.Làm cách nào để thay đổi hành vi của phương pháp thông qua phản ánh?

Điều tôi muốn làm bây giờ là thay đổi hành vi (phương thức đó - với cùng chữ ký và kiểu trả về) bằng cách sử dụng sự phản chiếu.

Có thể không? Nếu không, bất kỳ mẫu thiết kế nào có thể cứu tôi không?

Cảm ơn!

EDIT: Có một số nhầm lẫn về những gì tôi có thể thay đổi/sửa đổi. Tôi không thể thay đổi bất kỳ lớp/phương thức hiện có nào - nhưng tôi có thể thêm nhiều lớp vào dự án. Điều tốt nhất tôi có thể làm với các lớp hiện có là chú thích chúng. Điều này được thực hiện để tránh vi phạm bất cứ điều gì trong mã hiện có - có nghĩa là một vòng kiểm tra hoàn chỉnh cho một dự án lớn.

CHỈNH SỬA 2: java.lang.Instrumentation không khả dụng cho Android - nếu không nó có vẻ phù hợp!

+0

Tại sao phản ánh? –

+3

Bạn không được phép thay đổi nó, nhưng bạn được phép sửa đổi nó thông qua sự phản ánh? Điều đó dường như có nhiều rủi ro hơn. – Keppil

+0

Tôi nghĩ rằng điều này sẽ kết thúc trong một cơn ác mộng bảo trì. Mã sẽ nằm ở bất cứ ai đọc nó. Đi và nhận được sự chấp thuận để thay đổi lớp đó. – SpaceTrucker

Trả lời

18

Âm thanh như một yêu cầu kỳ lạ ...

Dù sao, phản ánh không cho phép bạn thay đổi hành vi mã, nó chỉ có thể khám phá mã hiện tại, gọi các phương pháp và constuctors, lĩnh vực thay đổi giá trị, mà loại của sự vật.

Nếu bạn muốn thực sự thay đổi hành vi của một phương pháp, bạn sẽ phải sử dụng thư viện thao tác bytecode như ASM. Nhưng điều này sẽ không thể rất dễ dàng, có lẽ không phải là một ý tưởng tốt ...

Patterns có thể giúp bạn:

  • Nếu lớp không phải là cuối cùng và bạn có thể sửa đổi các khách hàng, mở rộng các lớp hiện có và quá tải phương pháp, với hành vi mong muốn của bạn. Chỉnh sửa: điều đó sẽ chỉ hoạt động nếu phương thức không tĩnh!
  • Aspect lập trình: thêm tên lửa đánh chặn để phương pháp này sử dụng AspectJ

Dù sao, điều hợp lý nhất để làm là nên tìm một cách để sửa đổi các lớp, công việc ở quanh hiện tại sẽ chỉ làm cho mã của bạn phức tạp hơn và khó duy trì hơn.

Chúc may mắn.

+0

Phương thức tĩnh không thể ghi đè. Tôi tự hỏi nếu phản ánh có thể thay đổi giá trị trường, tại sao không phải là phương pháp! – SlowAndSteady

+0

Tôi mới tham gia AOP. Khám phá nó ngay bây giờ! – SlowAndSteady

+0

Bạn đang đúng về phương pháp là tĩnh của khóa học. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. –

8

Tôi đoán bạn có thể xem Instrumentation lớp học có phương thức redefineClasses(ClassDefintion classDefinition).

Định nghĩa lại có thể thay đổi các thân phương pháp, nhóm và thuộc tính không đổi. Việc xác định lại không được thêm, xóa hoặc đổi tên trường hoặc phương thức, thay đổi chữ ký của các phương thức hoặc thay đổi thừa kế.

Hy vọng điều này sẽ hữu ích.

Tài liệu tham khảo: Javadoc

+0

Xin lỗi, quên thêm đây là Android. Tôi không có lớp này để tận dụng :( – SlowAndSteady

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