コンパイル時に ASM のようなバイトコード操作ライブラリを使用することは可能ですか?
具体的には、Java のアノテーション処理 API を使用して、アノテーション付きのクラスにボイラープレートを多用するメソッドを実装したいと考えています。注釈プロセッサの実装は簡単ですが、実行.class
時にファイルがまだ存在していないようProcessor
です。別の方法はありますか?
コンパイル時に ASM のようなバイトコード操作ライブラリを使用することは可能ですか?
具体的には、Java のアノテーション処理 API を使用して、アノテーション付きのクラスにボイラープレートを多用するメソッドを実装したいと考えています。注釈プロセッサの実装は簡単ですが、実行.class
時にファイルがまだ存在していないようProcessor
です。別の方法はありますか?
コンパイル後のステップとしてクラスを強化および保存できるJavassist ( http://www.jboss.org/javassist )に興味があるかもしれません。
この記事では、拡張クラスを保存する方法について説明します: https://dzone.com/articles/implementing-build-time
特に、クラスを変更したら、次のようなことができます。
compiledClass.writeFile("/tmp/modifiedClassesFolder");
次のプロジェクトがそれを行っているので、それは可能であるはずです: Project Lombok
また:
Java 8 では、Java コンパイラ (javac) 用のプラグインを作成できる新しいメカニズムが導入されます。コンパイラ プラグインを使用すると、コード ベースを変更せずに javac に新しいフェーズを追加できます。新しい動作をプラグインにカプセル化し、他のユーザーが使用できるように配布できます。たとえば、javac プラグインを使用して次のことを行うことができます。
• コンパイル時のチェックを追加する
• コード変換を追加する
• ソース コードのカスタマイズされた分析を実行する
代わりに CGLib を使用する必要があります。CGLib を使用すると、メソッド インターセプターを使用してプロキシを追加し、インターセプターにボイラープレート コードを実装させることができます。別のオプションは、Javassist を見ることです。Javassist を使用すると、実際のテキスト (文字列) を使用して文字どおり新しいサブクラスを作成し、javassist にそれをバイトコードにコンパイルさせます。