ลอมบอกทำงานอย่างไร


148

ฉันพบลอมบอกวันนี้
ฉันกังวลมากที่รู้ว่ามันทำงานอย่างไร
บทความ Java Geekให้เบาะแสบางอย่าง แต่มันไม่ชัดเจนสำหรับฉัน:

Java 6 ลบ apt และทำให้ javac สามารถจัดการคำอธิบายประกอบและปรับปรุงกระบวนการเพื่อให้ได้การคำนวณขั้นตอนเดียวที่ง่ายขึ้น นี่คือเส้นทางของลอมบอก

บางทีด้วย Java 6 กระบวนการคอมไพล์จะเป็น: javac -> apt -> กระบวนการ lombok apt -> อ่านคลาสไฟล์และเพิ่มเมธอด set / get โดยใช้ASM ?

คุณช่วยแสดงรายละเอียดเพิ่มเติมเกี่ยวกับกลไกให้ฉันดูได้ไหม


1
ตรวจสอบบทความนี้: stackextend.com/java/first-step-lombok-annotations
Mouad EL Fakir

คำตอบ:


135

ลอมบอกทำโค้ดกับ API ภายในอย่างแน่นอนเช่นเดียวกับฌอนแพทริคฟลอยด์กล่าว แต่เป็น Lombok ใช้เฉพาะที่เกี่ยวข้องในขั้นตอนการรวบรวมของความเข้าใจผิดที่จะเรียกร้องลอมบอกจะทำงานเฉพาะบนดวงอาทิตย์ VM มันจะรวบรวมเฉพาะ ecj หรือ javac ของดวงอาทิตย์เท่านั้น อย่างไรก็ตาม VMs ส่วนใหญ่ที่อยู่ตรงนั้นถ้าพวกเขาส่งคอมไพเลอร์เลยเป็นหนึ่งในสองอย่างนั้น ตัวอย่างเช่น Apple VM มาพร้อมกับสต็อก sun javac และ lombok ดังกล่าวทำงานได้ดีบน macs เช่นเดียวกันกับ soylatte VM เช่น

ในขณะที่ javac เราต้องติดกับการอัพเดทของพวกเขาส่วนหนึ่งเป็นเพราะการทำงานอย่างต่อเนื่องในคอมไพเลอร์ของพวกเขาตอนนี้เราต้องทำการปรับเปลี่ยนเล็กน้อยเพียง 1 ครั้งเพื่อสนับสนุน eclipse ของเราในหลาย ๆ เวอร์ชันของ eclipse ดังนั้นในขณะที่เราทำโค้ดกับ API ภายในมันเป็นบิตที่ค่อนข้างเสถียร

หากสิ่งที่ lombok สามารถทำได้โดยไม่หันไปใช้ API ภายในเราจะทำอย่างอื่น แต่ก็ไม่สามารถทำได้ดังนั้นเราจึงหันไปใช้การใช้ API ภายใน

NB: ฉันเป็นหนึ่งในผู้พัฒนานำของลอมบอกดังนั้นฉันอาจจะลำเอียงเล็กน้อย: P


7
ดีใจที่ได้ทราบจากแหล่งที่มา (+1) ฉันยอมรับว่าคำสั่งของฉันเกี่ยวกับการทำงานนั้นทำให้เข้าใจผิด ฉันหมายถึงลอมบอกสามารถทำงานบน Sun VMs ได้เท่านั้น แต่โค้ดผลลัพธ์นั้นแน่นอนว่าเป็นแพลตฟอร์มที่เป็นกลาง
ฌอนแพทริคฟลอยด์

ฉันสงสัยว่าตัวประมวลผลคำอธิบายประกอบสามารถมอบหมายทุกอย่างให้กับคอมไพเลอร์ eclipse ได้หรือไม่แม้ว่าจะถูกเรียกใช้ผ่าน JavaC ด้วยวิธีนี้มีเพียงตัวประมวลผลเดียวที่จะเรียก
Archimedes Trajano

@rzwitserloot: นั่นเป็นเหตุผลที่ฉันชอบ SO จริงๆ คำตอบของแท้จากนักพัฒนาตัวเองหลัก
gaurav

78

ใช้JSR 269 Pluggable Annotation Processing API ที่มีใน Java 6

โปรดทราบว่ามีไฟล์ชื่อlombok.jar /META-INF/services/javax.annotation.processing.Processorเมื่อjavacเห็นไฟล์นี้ใน classpath การรวบรวมจะเรียกใช้ตัวประมวลผลคำอธิบายประกอบที่กำหนดไว้ในระหว่างการรวบรวม


คำตอบที่ดี @axtavt!
gaurav

54

นอกเหนือจากคำตอบของ axtavt: ลอมบอกใช้มากเกินกว่าที่ JSR 269 api ตีแผ่ รหัสลอมบ็อคกับ a) javac apis ภายในและ b) eclipse apis ภายใน (ในตัวประมวลผลแยกต่างหาก) JSR 269 ไม่อนุญาตให้คุณแก้ไขซอร์สโค้ดที่มีอยู่ แต่เมื่อคุณส่งElementไปยังโหนด AST พื้นฐานคุณสามารถแก้ไข AST (ซึ่งเป็นโครงการลอมบอกที่ทำ)

ดังนั้นลอมบอกเป็นแฮ็คขนาดใหญ่ที่จะเรียกใช้การรวบรวมบน Sun VM (afaik) เท่านั้น มันเป็นซอฟต์แวร์ที่ยอดเยี่ยม แต่ก็มีคนจำนวนมากที่เกลียดการแฮ็กที่ไม่ได้มาตรฐาน


1
นี่เป็นข้อมูลที่ถูกต้องใช่ไหม
Ondra Žižka

1
ได้. เป็นจริงทั้งหมดของมัน
Sean Patrick Floyd

@SeanPatrickFloyd ภาคผนวก: ฉันยังไม่มีปัญหาในการรวบรวมคำอธิบายประกอบลอมบอกกับ OpenJDK 11
orithena

1
@orithena ใช่ว่าควรจะทำงาน เว้นแต่คุณจะแนะนำโปรเซสเซอร์คำอธิบายประกอบตัวที่สองและจู่ๆก็พบเจอกับสภาพการแข่งขันเนื่องจากลอมบอกกำลังเปลี่ยน AST ซึ่งโปรเซสเซอร์อื่นคาดว่าจะพบ
ฌอนแพทริคฟลอยด์

2
ฉันจะลองตอบคำถามของฉันเองโปรดตรวจสอบเมื่อคุณมีโอกาส "เนื่องจาก Groovy / Kotlin มาพร้อมกับคอมไพเลอร์ตัวเต็มของตัวเองที่จะดูแลการสร้าง bytecode ไม่จำเป็นต้องแฮ็กกระบวนการสร้างโดยผู้สร้างคอมไพเลอร์
เพื่อนสุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.