Tôi cần phương pháp proxy trên các lớp chế độ xem khác nhau trong Khung giao diện người dùng Android như TextView
. Riêng TextView#setText(int resId)
. Phương thức này không phải là một phần của giao diện. Do đó, Java Proxy sẽ không hoạt động vì nó chỉ hoạt động đối với giao diện. Tôi cần sử dụng thao tác bytecode.Phương pháp cuối cùng của Proxy Trong lớp học cuối cùng
Tôi đã tìm thấy thư viện có tên là dexmaker có vẻ đầy hứa hẹn. Tôi giả định rằng tôi cần phải thực hiện thao tác mã byte thời gian chạy vì lớp Android View chỉ thực sự có sẵn trên thiết bị. Dexmaker có thể ủy quyền các phương thức công khai trên các lớp cụ thể. Sau đó, tôi nhận thấy rằng TextView#setText(int resId)
là không thể giải thích final. Bản thân lớp TextView
không phải là cuối cùng.
Tôi nghĩ rằng tôi có thể ngã ba dexmaker để hỗ trợ các phương pháp cuối cùng trong các lớp học không phải cuối cùng. Điều này có thể không? Tôi không muốn bắt đầu dự án này nếu không. Nó sẽ là một chiến thắng lớn cho thư viện của tôi mặc dù bởi vì các nhà phát triển sẽ không cần phải có lớp con, giao diện, hoặc các cuộc gọi phương thức tĩnh thủ công cho quan điểm của họ. Thư viện của tôi cần biết khi nào văn bản được đặt trên Chế độ xem cụ thể. Một proxy là mẫu thiết kế hoàn hảo cho việc này.
Ảnh ngẫu nhiên (vì nó không được đề cập): Bộ đệm bố cục cho phép [đặt một lớp nhà máy] (http://developer.android.com/reference/android/view/LayoutInflater. html # setFactory2 (android.view.LayoutInflater.Factory2)) có thể là những gì bạn đang theo dõi. Điều này được sử dụng trong [probe] (https://github.com/lucasr/probe/), nơi nhà máy tự động tạo proxy bằng cách sử dụng dexmaker để chặn các cuộc gọi. –
Một phần của thư viện của tôi thực sự sử dụng kỹ thuật nhà máy thổi phồng bố cục. Bạn đang nói rằng bạn có thể thiết lập một proxy có trên các đối tượng xem được tạo ra thông qua dexmaker? – jophde
Cảm ơn Stefan rất nhiều. Nguồn Probe chính xác là những gì tôi cần :). Nếu tôi hiểu một cách chính xác Probe tạo ra các lớp View hoàn toàn mới để giới hạn của trình rút gọn proxybuild không thể xử lý các phương thức cuối cùng không phải là một vấn đề? Từ tài liệu về trình soạn thảo ProxyBuilder: "Quá trình này chỉ hoạt động đối với các lớp có mức độ hiển thị công khai và được bảo vệ". – jophde