Trích xuất thông tin class Java từ tệp nhị phân biên dịch AOT
Biên dịch trước (AOT) trong thế giới Java đã là chủ đề tranh luận từ lâu, nhưng cho đến khi GraalVM xuất hiện, không có công cụ nào có thể đạt được biên dịch AOT tốt, chưa nói đến việc thúc đẩy toàn bộ hệ sinh thái. Mặc dù GraalVM cung cấp công cụ native-image để hỗ trợ hiệu quả các nhà phát triển trong biên dịch AOT, việc đạt được biên dịch AOT sẵn dùng cho ứng dụng Java vẫn rất thách thức do sự phức tạp và đa dạng của hệ sinh thái Java, đặc biệt với reflection và công nghệ proxy được sử dụng rộng rãi trong các framework phổ biến.
Dự án Spring Native
Nhờ dự án Spring Native của đội ngũ Spring Framework, họ có thể đạt được biên dịch AOT một chạm cho các dự án thông qua plugin Maven hoặc Gradle. Tuy nhiên, hiện tại nó chỉ áp dụng cho các dự án Spring Boot.
Vui lòng sử dụng Spring Native để tạo chương trình Java biên dịch AOT
Đây là các ví dụ Spring Native chính thức để tạo ứng dụng Java biên dịch AOT (Môi trường thử nghiệm: Ubuntu 20.04, Docker 20.10.6)
git clone https://github.com/spring-projects-experimental/spring-native.git
cd spring-native/sample/petclinic-jpa
./build.sh
Sau thời gian biên dịch tương đối dài và tiêu tốn nhiều bộ nhớ, chúng ta có thể nhận được chương trình Java biên dịch AOT trong thư mục target. Đây là tệp nhị phân độc lập có thể chạy độc lập mà không cần bất kỳ phụ thuộc nào.

petclinic-jpa là chương trình được biên dịch bởi AOT và có thể chạy trực tiếp
Trích xuất thông tin class Java từ tệp nhị phân biên dịch AOT
Bảo vệ mã Java luôn là vấn đề rất khó khăn, và AOT cũng được coi là giải pháp bảo vệ mã Java. Đáng tiếc, nhiều chương trình Java hiện nay không thể tách khỏi framework. Do sự phức tạp của framework, ngay cả chương trình biên dịch bởi AOT cũng phải bao gồm thông tin class trong tệp nhị phân cuối cùng. Các tệp class thực tế được sắp xếp gọn gàng trong vùng tài nguyên của tệp nhị phân.
Các công cụ sau có thể quét và trích xuất thông tin class từ tệp nhị phân biên dịch AOT
https://github.com/3-keys/binary-classfile-reader
git clone https://github.com/3-keys/binary-classfile-reader
cd binary-classfile-reader
./gradlew run --args='<path-of-the-binary-file> <output-folder>'
Sử dụng petclinic-jpa nhận được ở bước trước làm ví dụ, trích xuất thông tin class từ nó và so sánh với mã nguồn. Bạn có thể thấy thông tin model, thông tin controller và thông tin service đều có thể được thu thập.
