171

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

Java 6 では apt が削除され、javac で注釈を管理できるようになり、プロセスが合理化されて、より単純な単一ステップのコンピューティングが実現します。これがロンボクがたどった道です。

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

仕組みを詳しく教えてください。

4

4 に答える 4

162

Sean Patrick Floyd が言ったように、Lombok は実際に内部 API に対してコードを作成します。ただし、lombok はコンパイル フェーズにのみ関与するため、Lombok が Sun VM でのみ実行されると主張するのは誤解を招きます。ecj または sun の javac でのみコンパイルされます。ただし、コンパイラが出荷されたとしても、そこにある VM の大部分は、これら 2 つのうちの 1 つです。たとえば、Apple VM には標準の sun javac が同梱されているため、lombok は Mac 上で問題なく動作します。たとえば、ソイラッテ VM についても同様です。

javac については、現在コンパイラで多くの進行中の作業が行われていることもあり、更新に固執する必要がありますが、多くのバージョンの eclipse で eclipse サポートにわずか 1 つの調整を加えるだけで済みました。そのため、内部 API に対してコードを作成していますが、それらは比較的安定したビットです。

内部 API に頼らずに lombok ができることがあれば、何か他のことをしたはずですが、それはできないので、内部 API の使用に頼っています。

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

于 2011-05-24T23:04:51.487 に答える
102

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

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

于 2011-05-24T09:36:44.267 に答える
63

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

したがって、Lombok は、javac または eclipse のコンパイラを使用してのみコンパイルされる巨大なハックです。これは素晴らしいソフトウェアですが、非標準的なハックとして多くの人に嫌われています。

于 2011-05-24T09:47:32.850 に答える
54

Project Lombok:カスタムトランスフォーメーションの作成は役に立ちます。

于 2011-05-25T00:30:44.667 に答える