Tôi có một ứng dụng Android (java) mà đã làm việc tốt khi biên soạn với 1.6 SDK Android sử dụng đoạn mã sau từ lớp android.provider.Contacts:Đây có phải là phản ánh và mức độ nào không?
Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL;
Khi 2.0 SDK lại phát ra, android lớp .provider.Contacts đã bị khấu hao và được thay thế bằng android.provider.ContactsContract. Để có được một chương trình để làm việc trên cả 1.6 và 2.0, tôi biên soạn dưới 1.6 với sự thay đổi sau đây:
Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL;
…
try {
Class<?> c = Class.forName("android.provider.ContactsContract$PhoneLookup");
baseUri = (Uri) c.getField("CONTENT_FILTER_URI").get(baseUri);
}
catch (Exception e) {
}
Kể từ khi tôi đã được biên soạn dưới 1.6, tôi không thể nhập khẩu android.provider.ContactsContract vì nó là một lớp chỉ biết đến 2.0. Đây có phải là sự phản ánh và mức độ nào không?
Sau khi đọc phần "Phản ánh" của "Ngôn ngữ lập trình Java" (tôi nên làm trước), bây giờ tôi hiểu rõ bạn có thể làm gì với sự phản chiếu nhưng định nghĩa ngắn gọn về phản chiếu không phải là dễ dàng đi qua. Câu trả lời của bạn đã giúp làm rõ những gì đã nhắc câu hỏi của tôi - rằng một khi một lớp đã được phản ánh, và một thể hiện của lớp được tạo ra bằng cách sử dụng sự phản chiếu, bạn có thể tương tác với cá thể như thể lớp đã được new'ed.
Đây là nỗ lực ít ỏi của tôi tại một định nghĩa ngắn gọn rằng còn lâu mới hoàn hảo và tôi chắc chắn tôi sẽ cần phải chỉnh sửa như tôi tìm hiểu thêm:
Reflection là gián tiếp, năng động điều tra, xử lý hoặc gọi của các đối tượng lớp bằng cách sử dụng các đối tượng lớp có trong lớp java.lang.reflect hoặc lớp Class hoặc Package yêu cầu ban đầu truy cập vào lớp bằng cách sử dụng một tên chuỗi đầy đủ.
Lưu ý rằng ngay cả mặc dù đó URI bị phản đối trong 2.0, các chức năng vẫn nên tồn tại trong khuôn khổ một thời gian (mặc dù đôi khi Android có cách giải thích riêng của nó về từ "không được chấp nhận"). –
Bạn đúng là nó vẫn tồn tại ngoại trừ chức năng dưới 2.0 không hoạt động. Địa chỉ liên hệ được yêu cầu không được truy xuất lại.Tôi không thể nhớ nếu nó không trả về liên lạc hoặc liên lạc "Thẻ liên lạc của tôi" mỗi lần. – fupsduck
Thay vì mã trên, và dựa vào ngoại lệ ClassNotFound, bạn có thể chủ động kiểm tra phiên bản Android bạn đang chạy trong một thuộc tính môi trường, và sau đó chuyển đổi gọi hàm phụ trả về BaseURI –