trình nạp lớp
Trình nạp lớp về cơ bản là một bảng băm có các mục nhập được khóa theo tên lớp và trỏ đến mã byte được tải vào VM. Tất nhiên, mã byte được tải vào VM tất nhiên nằm ngoài giới hạn đối với quy trình Java, vì Java không cho phép bạn thao tác mã. Lưu ý rằng mã byte đã được JIT VM biên dịch thành mã dành riêng cho CPU và sẽ chứa các vị trí bộ nhớ và các cấu trúc cấp thấp khác.
Trình nạp lớp có thể được chia sẻ trong cùng một VM (thông qua tuần tự hóa hoặc các phương tiện khác), vì trình nạp lớp vẫn có thể trỏ tớinguyên bảnTuy nhiên, để tuần tự hóa và sau đó giải tuần tự hóa sang một máy ảo khác, trình nạp lớp phải tuần tự hóa mã byte. Đó là vấn đề.
Trình nạp lớp tuần tự hóa
Là một thử nghiệm suy nghĩ, chúng ta sẽ tuần tự hóa mã như thế nào để các quy trình khác có thể giải tuần tự hóa nó?
Chúng ta phải xử lý nó như một khối có kích thước lớp để thực thể được tuần tự hóa có toàn bộ giao diện lớp. Chúng ta sẽ phải "giải quyết" các con trỏ tới các ký hiệu trong mã byte. Chúng ta cũng phải sao chép toàn bộ bảng chuỗi và ký hiệu cho lớp để việc xem xét nội tâm có thể tiếp tục hoạt động.
Những gì chúng ta vừa xác định chính là tệp lớp (việc khởi tạo các thành viên của lớp hơi khác so với việc tuần tự hóa)
Hãy để tôi nhắc lại:tập tin lớp ĐúngPhiên bản nối tiếp của lớp.
Câu hỏi hóc búa về DEX
Tuy nhiên, Android biên dịch trước các tệp lớp thành DEX. Đây là một tệp duy nhất chứa phiên bản JAR được tối ưu hóa - các lớp được liên kết trước với nhau và tất cả các ký hiệu chuỗi đều nằm trong cùng một nhóm ký hiệu/chuỗi được chia sẻ. Do đó, trong Android, thành phần nhỏ nhất có thể chia sẻ là DEX.
Trong nhiều trường hợp, nhà sản xuất ứng dụng hoặc thiết bị tạo tệp ODEX. Đây là tệp DEX được biên dịch cho một CPU và kiến trúc cụ thể (bao gồm cả hệ thống endian lớn hoặc endian nhỏ).
Trong Android, bạn có thể coi tệp ODEX là trình nạp lớp tuần tự hóa.
Tải lớp từ xa
Điểm mấu chốt của vấn đề là làm thế nào một quy trình tải các tệp lớp mà quy trình ban đầu có thể nhìn thấy được. yorkwđề nghị mộttrình nạp lớpAnh ấy/cô ấy đã tìm ra ai đã làm những gì tôi đề nghị. Phương thức này là quy trình đầu tiên triển khai dịch vụ tra cứu lớp và trả về mã byte của lớp. Tuy nhiên, do các vấn đề DEX được liệt kê ở trên nên ứng dụng này không chạy trực tiếp trên Android.
Giải pháp?
Do đó, mọi giải pháp bạn triển khai sẽ dựa trên (O)DEX. Về cơ bản, bạn cần yêu cầu khách hàng giao tiếp với máy chủ của mình và yêu cầu tệp (O)DEX, sau đó tệp này sẽ được tải dưới dạng một thực thể duy nhất. Đang tải nó sẽ trả về trình nạp lớp mới của bạn
Hiện tại, tôi chưa bao giờ làm điều này và hoàn toàn có khả năng Android chỉ cho phép tải một tệp DEX, do đó phá vỡ phương pháp này. YMMV
Tôi hy vọng cuộc thảo luận này sẽ giúp...
TL;DR Tuy nhiên, bạn không thể tuần tự hóa trình nạp lớp;khả thiCó thể thuyết phục một quy trình khác tải tệp (O)DEX, điều này sẽ tạo ra kết quả tương tự.
Tôi là một lập trình viên xuất sắc, rất giỏi!