Javassist は、アプリケーションの Java バイトコードを操作する手段を提供する Java ライブラリです。
わかりましたが、なぜバイトコードを操作する必要があるのでしょうか?
実際の例はありますか?javassistが使用した実際のアプリはありますか?
一般的なアプリケーションは、実行時にプロキシ クラスを生成することです。つまり、実行時にすべてのメソッド呼び出しをインターセプトするサブクラスを作成します。例:
Hibernateは Proxies を使用してエンティティのメソッド呼び出しをインターセプトし、レイジー ローディングを実装します。つまり、最初にアクセスされたときにデータベースからオブジェクトをフェッチします。
Spring Framework は Proxies を使用して AOP サポートを実装します。これにより、特に宣言型トランザクションのサポートが強化されます。また、プロキシを使用して適切なスコープを適用します。
EJBはプロキシを使用して、コンテナ管理のトランザクション、認可チェックを実装し、ユーザー定義のインターセプタを適用します。
CDI実装は、マネージド Bean をプロキシして、適切なスコープを確保する必要もあります。バイト コード エンジニアリング ライブラリも使用していると思われます。
私は最近 Javassist を使用して、すべてのメソッド呼び出しをインターセプトし、最初の呼び出しでのみスーパー実装に委譲することにより、メソッドの戻り値の透過的なキャッシュを実装しました。
java.lang.reflect.Proxy
は実行時にプロキシ クラスを生成できますが、インターフェイスを実装することしかできず、クラスを拡張できないことに注意してください。上記のすべての使用例では、クラスのプロキシが必要です。
バイトコード操作は、特に特定のプロジェクトのソース コードがない場合に便利で必要です。あるプロジェクトのバイトコード (jar ファイルなど) しか持っていないが、コードの動作を何らかの方法で変更したい場合、バイトコード操作ライブラリがそのような場合に役立ちます。バイトコード操作の利点は、コードを再コンパイルする必要がなく、操作後に直接実行できることです。
バイトコード操作を使用してプログラム分析を行いました。ライブラリが与えられた場合、ランタイム中にライブラリ内のどのメソッドが呼び出されたかを知りたいです。バイトコード操作を使用System.out.println("method_name");
して、メソッドの先頭にステートメントを挿入できます。そのため、実行時に、呼び出されたメソッドが出力されます。
一部のバイトコード操作ライブラリは次のとおりです。
ASM プロジェクトのユーザー ページには、バイトコードの分析と操作に ASM を使用する、広く使用されている Java プロジェクトとフレームワークが数十個リストされています。http://asm.ow2.org/users.html