Tôi đã sử dụng Javassist để điều khiển động các lớp khi chúng được tải. Trong khi thêm mã vào một phương thức tương đối dễ dàng bằng cách sử dụng Javassist, tôi không thể tìm thấy cách để xóa mã.Xóa hướng dẫn khỏi mã Java bytecode
Tại thời điểm này, tôi đang mô phỏng việc xóa mã bằng cách sử dụng các hướng dẫn nop để thay thế các mã opcode được nhắm mục tiêu và bất kỳ thông số nào. Tuy nhiên, tôi coi đây là chủ yếu là một hack:
Mỗi opcode phải được xử lý riêng, vì độ dài byte của các thông số khác. Trong một số trường hợp, tôi cũng cần phải chọn giữa nop và pop, tùy thuộc vào việc opcode đã xóa có ảnh hưởng đến chồng hay không. Loại thao tác này bắt đầu trở nên tẻ nhạt - và mã mà nó đang dần trở nên phức tạp. Vì vậy, tự nhiên, tôi hy vọng cho một giải pháp hiện có.
Kết quả cuối cùng được điền với các hướng dẫn nop. Trong khi JVM nên tối ưu hóa chúng ra mà không có tác động hiệu suất, kết quả bytecode vẫn còn khá không phù hợp và lớn hơn mức cần thiết. Đây là một vấn đề về thẩm mỹ, nhưng nó vẫn là điều cần cân nhắc.
Thật không may, chỉ đơn thuần dịch các phần của mảng bytecode để đóng khoảng trống là không đủ - bất kỳ tham chiếu nào đến mã đã di chuyển (ví dụ: chỉ mục hướng dẫn chi nhánh) cũng phải được cập nhật.
Có thể xóa hướng dẫn bằng Javassist không? Ngoài ra, có một thư viện thao tác bytecode mà sẽ cho phép tôi làm điều đó một cách dễ dàng, mà không cần phải phân tích bản thân bytecode bản thân mình?
Tôi chỉ tò mò thôi. Tại sao bạn muốn làm nó? Sẽ không dễ dàng hơn để dịch ngược các lớp, sửa đổi chúng và biên dịch lại chúng? – Luixv
@Luixv: Tôi muốn quy trình thao tác diễn ra tự động trong thời gian chạy - sửa đổi mã nguồn thực tế theo cách thủ công không phải là một tùy chọn, bởi vì các phép biến đổi không cố định. – thkala
Nếu bạn đặt lớp trong một 'jar', thì' nop' thừa sẽ được nén khá tốt và kích thước nén sẽ không lớn hơn nhiều. –