経緯
javaでカバレッジ上げろと言われてもどこを通ってないのかさっぱりわからなかったので、コンパイル時にどう展開されているのか調べたかった。
解決方法
デコンパイルしてclassファイルを確認すればいい。日本語のサイトだとJADというツールが引っかかるが、これは古いのでCFRというデコンパイラを使う。
試してみる
シンプルなtry-with-resourcesがどう展開されているのかを確認する。
- Hoge.java
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.stream.Collectors;
public class Hoge {
public String config;
private Hoge() {
try (BufferedReader br = new BufferedReader(new FileReader("config"))) {
config = br.lines().collect(Collectors.joining("\n"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
- デコンパイルする
$ javac Hoge.java
$ java -jar cfr-0.150.jar --tryresources false --decodefinally false Hoge.class > HogeHoge.java
- 結果
/*
* Decompiled with CFR 0.150.
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.stream.Collectors;
public class Hoge {
public String config;
private Hoge() {
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader("config"));
try {
this.config = bufferedReader.lines().collect(Collectors.joining("\n"));
}
catch (Throwable throwable) {
try {
bufferedReader.close();
}
catch (Throwable throwable2) {
throwable.addSuppressed(throwable2);
}
throw throwable;
}
bufferedReader.close();
}
catch (IOException iOException) {
iOException.printStackTrace();
}
}
}
余談
カバレッジの確認でjacocoを利用していたが、jacocoのバージョンを上げたら余計な分岐の確認をしなくなったのか、無理してでコンパイルしなくても網羅できるようになった。