きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Lombokの自動生成コードのsetterにブレークポイントを張って容易にデバッグしたい

小ネタ。特定項目が処理の開始時は1だったのに、処理の終了時には1000が代入されていたとします。規模が小さいうちはSetterBuilder等々の呼び出し元にブレークポイントを張っていればいいのですが、規模が大きくなってくるとブレークポイントを張るだけでも一苦労です。

今回の記事では、Lombokの自動生成コードにブレークポイントを張って、容易にデバッグできるようにします。

環境

  • Java
    • 17
  • Lombok
    • 1.18.24
  • デコンパイルできる環境
    • IntelliJ IDEA 2022.2.3
      • FernFlower decompiler

対応

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程度なら手動作成でもいいのですが、BuilderToBuilder等々のメソッドを作るのが面倒なので、基本的にはクラスファイルからデコンパイルしたほうが楽だと思います。

ソースコード

なし。

終わりに

単純ではあるのですが、意外とやっていない人が周りに多いような気がしたのでブログにしました。こういうデバッグ作業はあまり共有されない気がしているので、誰かの役に立てば幸いです。

ただ、エンティティの項目を監視して、特定の値になったタイミングで処理を停止できるデバッグ機能の方があったらうれしいのですが…。リモートデバッグもいずれはやりたいのですが、やり方が全然ピンと来ていないので、デバッグ能力の向上もしていきたいですね。

類似情報

Lombokはいろいろ調べているので、もし興味があったらこちらの記事も見てください。