ロンボクはどのように機能しますか?


148

今日ロンボクに会った。
私はそれがどのように機能するかを知りたいと非常に切望しています。
Java Geek Articleはいくつかの手掛かりを与えますが、私には完全に明確ではありません:

Java 6はaptを削除し、javacが注釈を管理できるようにし、プロセスを合理化して、より簡単なシングルステップコンピューティングを取得します。これはロンボクがたどった経路です。

多分Java 6では、コンパイルプロセスは次のようになります:javac-> apt-> lombok aptプロセス->クラスファイルを読み取り、ASMを使用してset / getメソッドを追加しますか?

メカニズムの詳細を教えてください。


1
この記事を確認してください:stackextend.com/java/first-step-lombok-annotations
Mouad EL Fakir

回答:


135

ショーンパトリックフロイドが言ったように、ロンボクは確かに内部APIに対してコードを実行します。ただし、lombokはコンパイルフェーズにのみ関与しているため、Lombokはsun VMでのみ実行されると誤解を招きます。ecjまたはsunのjavacでのみコンパイルされます。ただし、世の中にあるVMの大多数は、コンパイラーを出荷する場合でも、これらの2つのうちの1つです。たとえば、Apple VMには標準のSun javacが同梱されているため、ロンボクはMacでも問題なく動作します。たとえば、soylatte VMについても同様です。

javacの場合、コンパイラの継続的な作業が進んでいることもあり、更新に固執する必要がありますが、多くのバージョンのeclipseでeclipseサポートをわずか1回調整するだけで済みました。したがって、内部APIに対してコードを実行する一方で、それらは比較的安定したビットです。

内部APIを使用せずにロンボクの機能を実行できる場合は、別のことを実行しましたが、実行できなかったため、内部APIを使用します。

注意:私はロンボクのリード開発者の一人なので、おそらく少し偏っています:P


7
ソース(+1)からの連絡に最適です。認める、走ることについての私の声明は誤解を招くものでした。LombokはSun VMでしか実行できないことを意味しましたが、結果のコードはもちろんプラットフォームに依存しません。
Sean Patrick Floyd、

呼び出すプロセッサが1つしかないようにJavaCを介して実行されている場合でも、注釈プロセッサがすべてをEclipseコンパイラに委任できるのかと思います。
Archimedes Trajano

@rzwitserloot:それが私が本当にSOが好きな理由です。コア開発者自身からの本物の答え。
gaurav

78

これは、Java 6で利用可能なJSR 269 Pluggable Annotation Processing APIを使用します。

lombok.jarという名前のファイルが含まれていることに注意してください/META-INF/services/javax.annotation.processing.Processor。ときにjavacコンパイルクラスパスにこのファイルを見て、それはコンパイル時にそこに定義された注釈プロセッサを実行します。


すばらしい回答@axtavt!
gaurav

54

axtavtの答えの補遺:Lombokは、JSR 269 apiが公開しているよりもはるかに多くを使用しています。Lombokコードは、a)内部javac apiおよびb)内部Eclipse API(別のプロセッサ内)に対して使用されます。JSR 269では既存のソースコードを変更できませんElementが、基になるASTノードにをキャストすると、実際にASTを変更できます(これはLombokが行うプロジェクトです)。

したがって、LombokはSun VM(afaik)でのみコンパイルを実行する巨大なハックです。これはすばらしいソフトウェアですが、このような非標準的なハックであることも多くの人に嫌われています。


1
これはまだ有効な情報ですか?
OndraŽižka18年

1
うん。それはすべて本当です。
ショーンパトリックフロイド

@SeanPatrickFloyd補遺:OpenJDK 11でLombokアノテーションをコンパイルするのに問題はありませんでした
orithena

1
@orithenaはい、それでうまくいくはずです。2番目の注釈プロセッサを導入し、Lombokが他のプロセッサが検出することを期待しているASTを変更しているために突然競合状態になった場合を除きます。
Sean Patrick Floyd

2
私は自分の質問に答えてみます。機会があれば確認してください。「Groovy / Kotlinには独自の本格的なコンパイラーが付属しているため、バイトコードの生成を処理します。別のコンパイラー(Javaコンパイラー)のバイトコード生成プロセスをハックする必要はありません。」
ランダムな

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.