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上ではこうなります。
右側のStructureに注目してください。色々なメソッドが自動生成されています。getterとかありますね。後は普通に使うだけです。
setterやgetterでbreakしてステップ実行したい
**残念ながらできません・・・。**ソースコードが無いのでbreakポイントを設定できません。右側のStructureからメソッドを選択して”Toggle Method Breakpoint”をしても設定できません。
代替策としてフィールドに対してbreakpointを設定する方法があります。
例えば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した例です。
下側の部分でthisがage=30, 実引数がage=40となっていて、正しくbreakできています。
以上です。