小ネタ。特定項目が処理の開始時は1だったのに、処理の終了時には1000が代入されていたとします。規模が小さいうちはSetter
やBuilder
等々の呼び出し元にブレークポイントを張っていればいいのですが、規模が大きくなってくるとブレークポイントを張るだけでも一苦労です。
今回の記事では、Lombokの自動生成コードにブレークポイントを張って、容易にデバッグできるようにします。
環境
- Java
- 17
- Lombok
- 1.18.24
- デコンパイルできる環境
- IntelliJ IDEA 2022.2.3
- FernFlower decompiler
- IntelliJ IDEA 2022.2.3
対応
Lombokは生成先のメソッドが存在する場合にはコードを自動生成しません。Lombokによる上書き等々も発生しません。
// プロダクトコード(.java) @Setter public class UserDto implements Serializable { String userId; public void setUserId(final String userId) { System.out.println("デバッグ:" + userId); this.userId = userId; } }
// クラスファイル(.class) public class UserDto implements Serializable { String userId; // プロダクトコードで定義したメソッド public void setUserId(final String userId) { System.out.println("デバッグ:" + userId); this.userId = userId; } // 本来、Lombokから自動生成されるメソッド // public void setUserId(final String userId) { // this.userId = userId; // } }
そのため1度プロダクトコードをコンパイルし、生成されたクラスファイルからデコンパイルしたコードをプロダクトコード側に移植することで、ブレークポイントを張って容易にデバッグできます。
Setter
程度なら手動作成でもいいのですが、Builder
やToBuilder
等々のメソッドを作るのが面倒なので、基本的にはクラスファイルからデコンパイルしたほうが楽だと思います。
ソースコード
なし。
終わりに
単純ではあるのですが、意外とやっていない人が周りに多いような気がしたのでブログにしました。こういうデバッグ作業はあまり共有されない気がしているので、誰かの役に立てば幸いです。
ただ、エンティティの項目を監視して、特定の値になったタイミングで処理を停止できるデバッグ機能の方があったらうれしいのですが…。リモートデバッグもいずれはやりたいのですが、やり方が全然ピンと来ていないので、デバッグ能力の向上もしていきたいですね。
類似情報
Lombokはいろいろ調べているので、もし興味があったらこちらの記事も見てください。
- 【Java】lombokの便利な使い方(Builder編) - きり丸の技術日記
- JavaのLombokのWithアノテーションを素振りした - きり丸の技術日記
- Javaでデバッグ用にnullは出力しないToStringのようなメッセージを出力したい(JSON, Object Mapper, JsonInclude.Include.NON_NULL) - きり丸の技術日記
- Lombokで自動生成されるGetterのprefixを変更したかった(Accessor prefixが使いたかった) - きり丸の技術日記
- LombokでToString.IncludeとExclude、callSuperで便利にログ出力する - きり丸の技術日記
- 【Java】lombokのデフォルトのBuilderに不満があったので、解消方法を調べた(デフォルト値/Validation/再びBuilder) - きり丸の技術日記