Bagaimana cara kerja lombok?

148

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?

kode uuid
sumber
1
Lihat artikel ini: stackextend.com/java/first-step-lombok-annotations
Mouad EL Fakir

Jawaban:

135

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

rzwitserloot
sumber
7
Senang mendengar dari sumbernya (+1). Saya akui, pernyataan saya tentang berlari itu menyesatkan. Maksud saya Lombok hanya bisa berjalan di Sun VM, tetapi kode yang dihasilkan tentu saja netral.
Sean Patrick Floyd
Saya agak bertanya-tanya apakah prosesor anotasi dapat mendelegasikan segalanya ke kompiler gerhana bahkan jika sedang dijalankan melalui JavaC dengan cara itu hanya ada satu prosesor untuk memanggil.
Archimedes Trajano
@ rzwitserloot: itu sebabnya saya sangat suka SO. Jawaban tulus dari dev inti sendiri.
gaurav
78

Ia menggunakan JSR 269 Pluggable Annotation Processing API yang tersedia di Java 6.

Catatan yang lombok.jarberisi file bernama /META-INF/services/javax.annotation.processing.Processor. Ketika javacmelihat file ini di classpath kompilasi, ia menjalankan prosesor anotasi yang didefinisikan di sana selama kompilasi.

axtavt
sumber
jawaban yang bagus @axtavt!
gaurav
54

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 Elementke AST node yang mendasarinya, Anda sebenarnya dapat memodifikasi AST (yang merupakan proyek Lombok tidak).

Jadi Lombok adalah hack besar yang hanya akan menjalankan kompilasi pada Sun VM (afaik). Ini adalah perangkat lunak yang hebat, tetapi juga dibenci oleh banyak orang karena menjadi peretasan yang tidak standar.

Sean Patrick Floyd
sumber
1
Apakah info ini masih valid?
Ondra Žižka
1
Ya. Itu benar, semuanya.
Sean Patrick Floyd
@SeanPatrickFloyd Addendum: Saya belum punya masalah dalam mengkompilasi anotasi Lombok dengan OpenJDK 11.
orithena
1
@orithena ya, itu seharusnya berhasil. kecuali jika Anda memperkenalkan prosesor anotasi kedua, dan tiba-tiba mengalami kondisi balapan karena Lombok mengubah AST yang diharapkan oleh prosesor lain.
Sean Patrick Floyd
2
Saya akan mencoba menjawab pertanyaan saya sendiri, mohon validasi ketika Anda mendapat kesempatan "Karena Groovy / Kotlin datang dengan kompiler fullblown sendiri, yang akan mengurus pembuatan bytecode. Tidak perlu meretas proses pembuatan bytecode kompiler lain (Java Compiler)."
jadi-acak-Bung