Java Getriebe

Java und NetBeans

try-with-resources dekompiliert

Durch einen ungünstigen Zwischenfall war ich gestern gezwungen die Arbeit des Tages durch dekompilieren noch vorhandener .class-Dateien zu retten. Nicht alle aktuellen Tools zum dekompilieren sind momentan in der Lage mit den Spracherweiterungen von Java 8 umzugehen. Mit CFR habe ich aber dennoch eine funktionierende Version des Tagewerks wiederherstellen können. Zumindest funktionieren die wiederhergestellten Tests.

Interessant fand ich eine Methode, die ich in der Form nicht in Erinnerung hatte geschrieben zu haben: Recht lang und dirverse geschachtelte try-catch-finally Blöcke.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  public static <J> J parse(Path infile, Class<J> type)
      throws IOException {
    BufferedReader in = Files.newBufferedReader(
        infile, StandardCharsets.UTF_8);
    Throwable throwable = null;
    try {
      J j = parse(in, type);
      return j;
    } catch(IOException ex) {
      throwable = ex;
      throw ex;
    } finally {
      if(in != null) {
        if(throwable != null) {
          try {
            in.close();
          } catch(Throwable throwable3) {
            throwable.addSuppressed(throwable3);
          }
        } else {
          in.close();
        }
      }
    }
  }

Die eigentliche Arbeit ist hier in den Zeilen 3/4 und 7 bereits erledigt. Der Rest ist bei genauerer Betrachtung eigentlich nur Boilerplate Code. Nach kurzem Überlegen ist mir dann aber wieder eingefallen, wie die Methode eigentlich aussah:

1
2
3
4
5
6
7
  public static <J> J parse(Path infile, Class<J> type)
      throws IOException {
    try(BufferedReader in =
        Files.newBufferedReader(infile, StandardCharsets.UTF_8)) {
      return parse(in, type);
    }
  }

Ein Zwei-Zeiler (wenn man die Formatierung außer Acht lässt).

An diesem Beispiel kann man aber sehr schön sehen, was der Compiler (vermute ich) aus einem scheinbar einfachen try-with-resources Block als Bytecode in die .class Dateien schreibt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.