Làm thế nào để lombok làm việc?


148

Tôi đã gặp lombok ngày hôm nay.
Tôi rất lo lắng khi biết nó hoạt động như thế nào.
Một bài viết về Geek của Java đưa ra một số manh mối nhưng nó không hoàn toàn rõ ràng đối với tôi:

Java 6 loại bỏ apt và làm cho javac có thể quản lý các chú thích, hợp lý hóa quy trình để có được một tính toán bước đơn giản hơn. Đây là con đường được thực hiện bởi Lombok.

Có thể với Java 6, quá trình biên dịch sẽ là: javac -> apt -> lombok apt process -> đọc các tệp lớp và thêm các phương thức set / get bằng ASM ?

Bạn có thể chỉ cho tôi chi tiết hơn về cơ chế?


Câu trả lời:


135

Lombok thực sự viết mã chống lại API nội bộ, như Sean Patrick Floyd nói. Tuy nhiên, vì lombok CHỈ tham gia vào giai đoạn biên dịch, nên nó sai lầm khi tuyên bố Lombok sẽ chỉ chạy trên máy ảo mặt trời. Nó sẽ chỉ biên dịch trên javac của ecj hoặc sun. Tuy nhiên, phần lớn các máy ảo ngoài kia, nếu chúng gửi một trình biên dịch, là một trong hai máy ảo đó. Ví dụ, Apple VM xuất xưởng với javac sun sun, và như vậy lombok chỉ hoạt động tốt trên máy Mac. Tương tự như vậy đối với VM soylatte chẳng hạn.

Mặc dù đối với javac, chúng tôi thực sự phải gắn bó với các bản cập nhật của họ, một phần do có rất nhiều công việc đang diễn ra trên trình biên dịch của họ ngay bây giờ, chúng tôi đã phải thực hiện một điều chỉnh nhỏ cho hỗ trợ nhật thực qua nhiều phiên bản nhật thực. Vì vậy, trong khi chúng tôi thực hiện mã chống lại API nội bộ, chúng là các bit tương đối ổn định.

Nếu những gì lombok có thể được thực hiện mà không cần dùng đến API nội bộ, chúng tôi đã làm một việc khác, nhưng không thể thực hiện được, vì vậy chúng tôi sử dụng API nội bộ.

Lưu ý: Tôi là một trong những nhà phát triển hàng đầu của lombok, vì vậy, tôi có lẽ hơi thiên vị: P


7
Thật tuyệt khi nghe từ nguồn (+1). Tôi thừa nhận, tuyên bố của tôi về việc chạy là sai lệch. Ý tôi là Lombok chỉ có thể chạy trên Sun VM, nhưng mã kết quả dĩ nhiên là nền tảng trung tính.
Sean Patrick Floyd

Tôi tự hỏi liệu bộ xử lý chú thích có thể ủy thác mọi thứ cho trình biên dịch nhật thực ngay cả khi nó đang được chạy qua JavaC theo cách đó chỉ có một bộ xử lý để gọi.
Archimedes Trajano

@rzwitserloot: đó là lý do tại sao tôi thực sự thích SO. Câu trả lời chính hãng từ chính dev.
gaurav

78

Nó sử dụng API xử lý chú thích có thể cắm được của JSR 269 có sẵn trong Java 6.

Lưu ý rằng lombok.jarcó chứa một tập tin có tên /META-INF/services/javax.annotation.processing.Processor. Khi javacthấy tệp này trong một đường dẫn biên dịch, nó chạy các bộ xử lý chú thích được xác định ở đó trong quá trình biên dịch.


câu trả lời tuyệt vời @axtavt!
bò tót

54

Trong phần phụ lục cho câu trả lời của axtavt: Lombok sử dụng nhiều hơn so với api của JSR 269. Mã Lombok chống lại a) apis javac nội bộ và b) apis nhật thực nội bộ (trong một bộ xử lý riêng). JSR 269 không cho phép bạn sửa đổi mã nguồn hiện có, nhưng khi bạn truyền một Elementnút AST bên dưới, bạn thực sự có thể sửa đổi AST (đó là điều mà dự án Lombok thực hiện).

Vì vậy, Lombok là một hack lớn sẽ chỉ chạy biên dịch trên Sun VM (afaik). Đây là một phần mềm tuyệt vời, nhưng nó cũng bị nhiều người ghét vì là một bản hack không chuẩn.


1
Đây vẫn là thông tin hợp lệ?
Ondra ižka

1
Vâng Đó là sự thật, tất cả của nó.
Sean Patrick Floyd

@SeanPatrickFloyd Addendum: Tôi chưa gặp vấn đề gì khi biên dịch các chú thích Lombok với OpenJDK 11.
orithena

1
@orithena vâng, nên làm việc. trừ khi bạn giới thiệu bộ xử lý chú thích thứ hai và đột nhiên chạy vào điều kiện cuộc đua vì Lombok đang thay đổi AST mà bộ xử lý khác mong muốn tìm thấy.
Sean Patrick Floyd

2
Tôi sẽ cố gắng trả lời câu hỏi của riêng tôi, vui lòng xác thực khi bạn có cơ hội "Vì Groovy / Kotlin đi kèm với trình biên dịch fullblown của riêng nó, sẽ đảm nhiệm việc tạo mã byte.
quá ngẫu nhiên-anh chàng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.