つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

lombokを使う場合の自動生成メソッドのデバッグ(break)

   

lombokを使うとgetter, setterメソッドを自動生成してくれます。これを使った場合のデバッグ(ステップ実行)の話です。Intellijで解説しますが、Eclipseでも同じです。結論としてはできませんが、代替案はある感じです。

lombokの基本

@Dataや@AllArgsConstructorというアノテーションをJavaBeanに付けるとlombokがgetter, setterや全パラメタ有りのコンストラクタを自動生成してくれます。

例を見てみます。※試す場合はlombokプラグインをインストールしたり(Intellijの場合)、lombokをインストールしたり(Eclipseの場合)してください。

また、jarを用意するかMavenに以下のdependencyを書いておいてください。

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.14.4</version>
      <scope>provided</scope>
    </dependency>

 

package com.tsukaby.lombok.sample;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Person {
  private String firstName;
  private String lastName;
  private int age;
}

これらのアノテーションを付けるとどうなるか見てみます。まずはIDE上ではこうなります。

lombok1

右側のStructureに注目してください。色々なメソッドが自動生成されています。getterとかありますね。後は普通に使うだけです。

setterやgetterでbreakしてステップ実行したい

残念ながらできません・・・。ソースコードが無いのでbreakポイントを設定できません。右側のStructureからメソッドを選択して”Toggle Method Breakpoint”をしても設定できません。

代替策としてフィールドに対してbreakpointを設定する方法があります。

lombok2

例えばageフィールドに対して設定して、詳細を開いてみます。

このような画面が出るので後はWatch設定を適宜変えるだけです。上記の設定だとsetされたときにbreakしますが、getされたときにもbreakしたいのであればField accessをONにしておきます。

フィールドブレイクの確認(Field Watchの確認)

上記のブレイクポイントの設定のまま、以下のコードを用意してデバッグ実行してみます。

package com.tsukaby.lombok.sample;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class App {
  public static void main(String[] args) {
    // コンストラクタによるアクセス
    Person person = new Person("Taro", "Yamada", 20);

    // 通常アクセス
    person.setAge(30);

    // リフレクションアクセス
    try {
      Method method = person.getClass().getMethod("setAge", int.class);
      method.invoke(person, 40);
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }

    System.out.println(person);
  }
}

ちゃんと3回ブレイクしました(コンストラクタ部分、setAge(30)の部分、invokeの部分

以下はinvokeの部分でbreakした例です。

lombok3

下側の部分でthisがage=30, 実引数がage=40となっていて、正しくbreakできています。

以上です。

 - Java, ライブラリ