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