Lombok nasıl çalışır?


150

Bugün Lombok ile tanıştım .
Nasıl çalıştığını bilmek beni çok endişelendiriyor.
Bir Java Geek Makalesi bazı ipuçları veriyor, ancak bana tamamen açık değil:

Java 6, apt'yi kaldırır ve javac'ı ek açıklamaları yönetebilir hale getirerek, daha basit bir tek adımlı hesaplama elde etmek için süreci kolaylaştırır. Lombok'un izlediği yol budur.

Belki Java 6 ile derleme işlemi şöyle olacaktır: javac -> apt -> lombok apt işlemi -> sınıf dosyalarını okuyun ve ASM kullanarak set / get yöntemleri ekleyin ?

Bana mekanizma hakkında daha fazla ayrıntı gösterebilir misiniz?


Yanıtlar:


135

Lombok, Sean Patrick Floyd'un dediği gibi gerçekten de dahili API'ye karşı kodlama yapıyor. Bununla birlikte, lombok YALNIZCA derleme aşamasına dahil olduğundan, Lombok'un yalnızca bir sun VM üzerinde çalışacağını iddia etmesi yanıltıcıdır. Yalnızca ecj veya sun's javac üzerinde derlenir. Ancak, bir derleyici gönderirlerse, oradaki sanal makinelerin büyük çoğunluğu bu ikisinden biridir. Örneğin, Apple VM, stock sun javac ile birlikte gelir ve bu nedenle lombok, mac'larda gayet iyi çalışır. Aynısı örneğin soylatte VM için de geçerli.

Javac için gerçekten güncellemelerine bağlı kalmamız gerekse de, kısmen şu anda derleyicilerinde devam eden çok sayıda çalışma nedeniyle, birçok tutulma sürümünde tutulma desteğimizde sadece 1 küçük ayarlama yapmak zorunda kaldık. Dolayısıyla, biz dahili API'ye karşı kodlama yaparken, bunlar nispeten kararlı bitlerdir.

Lombok'un yaptığı şey dahili API'ye başvurmadan yapılabilirse, başka bir şey yapmış olurduk, ancak bu yapılamaz, bu yüzden dahili API kullanımına başvururuz.

Not: Lombok'un baş geliştiricilerinden biriyim, bu yüzden muhtemelen biraz önyargılıyım: P


7
Kaynaktan haber almak harika (+1). Kabul ediyorum, koşmakla ilgili açıklamam yanıltıcıydı. Lombok'un yalnızca Sun VM'lerinde çalışabileceğini söyledim, ancak ortaya çıkan kod elbette platformdan bağımsızdır.
Sean Patrick Floyd

JavaC aracılığıyla çalıştırılıyor olsa bile, açıklama işlemcisinin her şeyi eclipse derleyicisine delege edip edemeyeceğini merak ediyorum, bu şekilde çağrılacak tek bir işlemci var.
Arşimet Trajano

@rzwitserloot: Bu yüzden SO'yu gerçekten seviyorum. Çekirdek geliştiricinin kendisinden gerçek yanıtlar.
Gaurav

81

Java 6'da bulunan JSR 269 Pluggable Annotation Processing API'yi kullanır .

lombok.jarAdlı bir dosya içeren unutmayın /META-INF/services/javax.annotation.processing.Processor. Ne zaman javacbir derleme sınıf yolunda bu dosyayı görür, bu derleme sırasında orada tanımlanmış açıklama işlemcileri çalışır.


harika cevap @axtavt!
Gaurav

54

Axtavt'ın cevabına ek olarak: Lombok, JSR 269 api'nin gösterdiğinden çok daha fazlasını kullanıyor. Lombok, a) dahili javac apis ve b) dahili tutulma apisine (ayrı bir işlemcide) karşı kodlar. JSR 269, mevcut kaynak kodunu değiştirmenize izin vermez, ancak Elementtemeldeki AST düğümüne bir çevirdiğinizde , aslında AST'yi değiştirebilirsiniz (Lombok'un yaptığı proje budur).

Yani Lombok, yalnızca Sun VM (afaik) üzerinde derlemeyi çalıştıracak büyük bir hack'tir. Bu harika bir yazılım parçası, ancak aynı zamanda standart dışı bir bilgisayar korsanlığı olduğu için birçok kişi tarafından nefret ediliyor.


1
Bu bilgi hala geçerli mi?
Ondra Žižka

1
Evet. Hepsi doğru.
Sean Patrick Floyd

@SeanPatrickFloyd Eklentisi: OpenJDK 11 ile Lombok ek açıklamalarını derlemekte henüz sorun yaşamadım.
orithena

1
@orithena evet, işe yaramalı. İkinci bir not işlemcisi tanıtmadığınız ve Lombok AST'yi değiştirdiği için aniden yarış koşullarına girmedikçe, diğer işlemcinin bulmayı beklediği.
Sean Patrick Floyd

2
Kendi sorumu yanıtlamayı deneyeceğim, lütfen bir şansınız olduğunda doğrulayın "Groovy / Kotlin, bayt kodu üretmeye özen gösteren kendi tam dolu derleyicisiyle birlikte geldiğinden. Başka bir derleyicinin (Java Derleyicisi) bayt kodu oluşturma sürecini hacklemeye gerek yok."
çok rastgele adam

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.