web-dev-qa-db-ja.com

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

今日は lombok に会った。
私はそれがどのように機能するかをとても知りたいです。
A Java Geek Article はいくつかの手がかりを与えますが、私には完全に明確ではありません:

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

たぶんJava 6でコンパイルプロセスは次のようになります:javac-> apt-> lombok apt process->クラスファイルを読み取り、 [〜#〜] asmを使用してset/getメソッドを追加します[〜#〜]

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

128
uuidcode

Sean Patrick Floydが言ったように、Lombokは実際に内部APIに対してコードを作成します。ただし、lombokは[〜#〜] only [〜#〜]であるため、LombokはSun VMでのみ実行されると誤解されがちです。 ecjまたはSunのjavacでのみコンパイルされます。ただし、世の中に出回っているVMの大部分は、コンパイラーを出荷していれば、その2つのうちの1つです。たとえば、Apple VMは、Sun Sun javacに同梱されているので、ロンボクはMacでも問題なく動作します。たとえば、soylattte VMについても同様です。

Javacの場合、コンパイラーの継続的な作業の一部を理由に、実際には更新に固執する必要がありますが、Eclipseの多くのバージョンでEclipseのサポートをわずかに1つ調整する必要がありました。そのため、内部APIに対してコードを作成しますが、それらは比較的安定したビットです。

内部APIを使用せずにlombokの機能を実行できた場合、他の処理を実行できたはずですが、実行できないため、内部APIの使用を使用します。

NB:私はロンボクの主な開発者の1人なので、おそらく少し偏見があります:P

119
rzwitserloot

JSR 269 Pluggable Annotation Processing API を使用可能Java 6。

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

64
axtavt

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

ロンボクは巨大なハックです 走る SunでコンパイルするVM(afaik)。これは素晴らしいソフトウェアですが、多くの人がそのような非標準のハックであることを嫌っています。

45
43
uuidcode