2014.12.16この記事は約4分で読めます。アノテーションさえ十分に使いこなせていないが、、javaのlombokライブラリについて調べる機会があったので自分なりにまとめてみる。lombokは、AST変換というマジックを使ってコンパイラの変換プロセスの中で生成されたAST(抽象構文木)を操作し、アノテーションに対応するコードを差し込んでいるようだった。ソースからざっくりとした流れを追ってみる。参考リンク動作の流れjavacの変換の流れを見てみる。META-INF/servicesのjavax.annotation.processing.Processorのlombok.launch.AnnotationProcessorHider$AnnotationProcessorのprocessが呼ばれる。processメソッドを見ると、実際の処理はcreateWrappedInstanceメソッドで生成されるオブジェクト(lombok.core.AnnotationProcessorクラス)に転送される。lombok.core.AnnotationProcessorのprocessメソッドからlombok.javac.apt.Processorのprocessメソッドが呼ばれる。その中から、lombok.javac.JavacTransformerのtransformが呼ばれるが、その前にRoundEnvironmentのgetRootElementsメソッドで得られるjavax.lang.model.element.Elementのオブジェクトは、com.sun.tools.javac.tree.JCCompilationUnitに変換されている。transformメソッドで、JCCompilationUnitのオブジェクトは.lombok.javac.JavacASTクラスでラップされ、lombok.javac.JavacTransformer$AnnotationVisitorでASTをトラバースし、lombok.javac.JavacAnnotationHandlerクラスのハンドラーを呼んで変換される。AST非公開API?が使われている。mainメソッドを書き換えてみる。true;}}com.sun.tools.javac.util.Listでappendしてもサイズが増えないのは何故?よくわからない。上では、最後のBlockの初期化でJCExpressionStatementを渡している。DOMモデルと同じ考え方の独自のDOMとASTを持っているらしい。DOMと同様な考え方で、コードブロックに任意のStatementを挿入したりすることができる。Worldを出力するStatementを挿入し、コンパイルして実行する例。JDTCompilationUnitは、コンパイル単位でソースファイルに該当する。createASTメソッドでは、ASTNodeクラスのオブジェクトが返ってくるが、CompilationUnitはASTNodeクラスを継承しているためKindをK_COMPILATION_UNITに指定すればキャスト可能である。その後、ASTVisitorでASTをトラバースし、メソッド定義のブロックにSystem.out.printlnのStatementを差し込んでいる。jarファイルたちどのクラスがどのjarに含まれているのかわかりづらかった。簡単に調べられる方法はあるのだろうか。$f"done必要だったのは以下のjarたち。コピーbyebyehaikikyouをフォローするbyebyehaikikyouDEBUGLIFE関連記事javaJNIメモ1Impalaという分散クエリエンジンを使っていてImpaladが突然JVMのSIGSEGVで異常終了してしまうことがありソースを追いかけている。MacJavaをデバッグ実行したくOpenJDKをmac上でビルドした時のメモ。僕の環境は以下の通り。...javaJavaで作成した一時ファイルを終了時に削除するJavaのjava.nio.file.Filesで作った一時ファイルをプログラム終了時に削除するのにFilesクラスにそれ用のAPIがあるかと思っていたけどなかったので以下のようにして対応した。コメントをキャンセルメールアドレスが公開されることはありません。»タイトルとURLをコピーしました。