Saya bertemu lombok hari ini.
Saya sangat ingin tahu cara kerjanya.
Artikel Java Geek memberikan beberapa petunjuk tetapi tidak sepenuhnya jelas bagi saya:
Java 6 menghapus apt dan membuat javac mampu mengelola anotasi, merampingkan proses untuk mendapatkan komputasi langkah tunggal yang lebih sederhana. Ini adalah jalur yang diambil oleh Lombok.
Mungkin dengan Java 6 proses kompilasi akan menjadi: javac -> apt -> lombok apt process -> membaca file kelas dan menambahkan metode set / get menggunakan ASM ?
Bisakah Anda tunjukkan lebih detail tentang mekanisme ini?
java
annotations
lombok
kode uuid
sumber
sumber
Jawaban:
Lombok memang kode terhadap API internal, seperti kata Sean Patrick Floyd. Namun, karena lombok HANYA terlibat dalam fase kompilasi, menyesatkan untuk mengklaim Lombok hanya akan berjalan dengan VM matahari. Itu hanya akan dikompilasi di ECJ atau javac matahari. Namun, sebagian besar VM di luar sana, jika mereka mengirim kompiler sama sekali, adalah salah satu dari keduanya. Sebagai contoh, Apple VM dikirimkan dengan stock sun javac, dan dengan demikian lombok bekerja dengan baik di mac. Sama berlaku untuk VM soylatte, misalnya.
Sementara untuk javac kita benar-benar harus tetap dengan pembaruan mereka, sebagian karena banyak pekerjaan yang sedang berjalan pada kompiler mereka sekarang, kami harus membuat hanya 1 penyesuaian kecil untuk dukungan gerhana kami atas banyak banyak versi gerhana. Jadi, sementara kami melakukan kode terhadap API internal, mereka adalah bit yang relatif stabil.
Jika apa yang dilakukan lombok dapat dilakukan tanpa menggunakan API internal, kami akan melakukan sesuatu yang lain, tetapi itu tidak dapat dilakukan, jadi kami menggunakan penggunaan API internal.
NB: Saya salah satu pengembang utama lombok, jadi, saya mungkin sedikit bias: P
sumber
Ia menggunakan JSR 269 Pluggable Annotation Processing API yang tersedia di Java 6.
Catatan yang
lombok.jar
berisi file bernama/META-INF/services/javax.annotation.processing.Processor
. Ketikajavac
melihat file ini di classpath kompilasi, ia menjalankan prosesor anotasi yang didefinisikan di sana selama kompilasi.sumber
Selain jawaban axtavt: Lombok menggunakan lebih banyak daripada yang diekspos JSR 269. Kode Lombok terhadap a) apis javac internal dan b) apis gerhana internal (dalam prosesor terpisah). JSR 269 tidak membiarkan Anda mengubah kode sumber yang ada, tetapi ketika Anda melemparkan sebuah
Element
ke AST node yang mendasarinya, Anda sebenarnya dapat memodifikasi AST (yang merupakan proyek Lombok tidak).Jadi Lombok adalah hack besar yang hanya akan
menjalankankompilasi pada Sun VM (afaik). Ini adalah perangkat lunak yang hebat, tetapi juga dibenci oleh banyak orang karena menjadi peretasan yang tidak standar.sumber
Proyek Lombok: Membuat Transformasi Ubahsuaian sangat membantu.
sumber