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できています。
以上です。