せてぃーずノート

Javaのイベント参加レポートとかを書いたりします。

Lombokの生成したバイトコードを見てみる

2013年にブレークしたLombok。 詳しくは

http://d.hatena.ne.jp/nowokay/20130730

を参照で。
まずはgetter/setter。

import lombok.Data;

@Data
public class Employee {

    private String empCd;

    private String name;

    private int age;

}

上のようなソースから生成されたバイトコード

public void setEmpCd(java.lang.String empCd);
0  aload_0 [this]
1  aload_1 [empCd]
2  putfield byteread.Employee.empCd : java.lang.String [13]
5  return

のようにsetterがきちんと生成されてる。
すばらし~。
下手に人間が書くよりミスが少なくていいと思います。

あとはチェック例外でもスローできちゃうSneakyThrows。
発生することがない上に、キャッチしてもあまり意味が無いチェック例外を綺麗に無視できるのでとても便利です。

@SneakyThrows
public String getMessage(){
    throw new Exception();
}

このソースのバイトコードはこんな感じ。
例外のインスタンスを生成し、スローしているだけの処理に見えます。

 public java.lang.String getMessage();
 0  new java.lang.Exception [13]
 3  dup
 4  invokespecial java.lang.Exception() [15]
 7  athrow
 8  astore_1 [$ex]
 9  aload_1 [$ex]
10  athrow

比較のために以下のソースのバイトコードも並べてみます。

public String getMessage(){
    throw new RuntimeException();
}

バイトコードは例外のクラス名が違う以外はほぼ同じでした。

public java.lang.String getMessage();
0  new java.lang.RuntimeException [13]
3  dup
4  invokespecial java.lang.RuntimeException() [15]
7  athrow

これを見るとチェック例外もランタイム例外も実行においては関係ないっていうことです。たぶん。
要はコンパイラのチェックさえ通してしまえばいいんです。