Spis treści

Java 9 - nowości w bibliotece

Java 9 to zarówno zmiany “małe” jak np. dodaniee API w klasie Optional jak i “duże”, do których zaliczam - dodaną w “inkubatorze” - czyli odrębnym pakiecie - klasę HttpClient (i klasy z nią związane). (O HttpClient przeczytasz również w artykule Java 11 - HttpClient i uruchamianie jednoplikowych programów.)

Przyjrzyjmy się tym zmianom bliżej.

Zmiany w bibliotece standardowej

Małe zmiany

Java 9 wprowadziła kilka miłych zmian w bibliotece standardowej. W kategorii “drobnych” zmian w API znajdują się:

  • poprawki w klasie Optional umożliwiające elegancki chaining w przypadku braku wartości:
  • ifPresentOrElse(Consumer<T> action, Runnable emptyAction)
  • or(Supplier<Optional<T> other)
  • możliwość użycia na instancji Optional potęgi strumieni dzięki metodzie stream()
  • metody static factory w interfejsach kolekcji umożliwiające tworzenie “któtkich” (w bibliotece są warianty overloaded do 10 elementów), niemodyfikowalnych kolekcji: List.of(), Set.of()
  • można użyć diamond operator przy instancjonowaniu anonimowych klas wewnętrznych (inner)
  • interfejsy mogą mieć metody prywatne

Duże zmiany

Do zmian “dużych” zaliczam:

  • zastąpienie klasy HttpUrlConnection prawdziwym klientem HTTP; w tej wersji Javy znajduje się on w pakiekie jdk.incubator.http (dokumentacja), a oficjalnie jest wprowadzony dopiero w Javie 11 (dokumentacja, wprowadzenie).
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.net.http.*;
import java.net.URI;

// This example requires non-incubator API
public class EchoGet {
  public static void main(String[] args) throws Exception {

    HttpRequest request = HttpRequest.newBuilder()
      .uri(new URI("https://postman-echo.com/get"))
      .GET()
      .build();

    HttpResponse<String> response = HttpClient.newHttpClient()
      .send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response);
  }
}
  • wprowadzenie nowego API do zarządzania istniejącymi procesami, głównie poprzez rozszerzenie klasy java.lang.ProcessHandle
  • pozwala ono na znalezienie “uchwytu” bieżącego procesu, procesu o pewnym PID, znalezienie dzieci procesu, potomków procesu, jego rodzica, a nawet wszystkich widocznych procesów (metody current(), of(long), children(), descendants(), parent() i allProcesses())
  • pozwala na pobranie informacji o procesie (klasa ProcessHandle.Info) takich jak: argumenty, wiersz poleceń, użytkownik, czas rozpoczęcia
  • umożliwia zniszczenie procesu
  • istniejąca klasa Process reprezentuje proces potomny utworzony z bieżącego procesu i daje możliwość czytania/pisania/przekierowania z/do strumieni standardowych; można z niej również uzyskać “handle” do procesu natywnego
  • metoda onExit() zwraca CompletableFuture, co pozwala na asynchroniczne wykonanie dowolnej akcji gdy proces rzeczywiście się zakończy (bądż synchroniczne czekanie przy użyciu get())

Przykład

Przykład użycia API do monitorowania procesów: wypisanie i zliczenie wszystkich procesów w systemie (NativeProc.java):

Gist na GitHub

Uwaga: Bloki tekstowe są (nawet w javie 14) preview feature, więc program należy skompilować i uruchomić przy użyciu flagi --enable-preview, co zresztą dobrze widać na poniższym rezultacie: proces 8090 to proces generujący poniższe dane, czyli JVM v.14, na której uruchomiłam program NativeProc. Jednym z jego argumentów jest właśnie --enable-preview.

Kompilacja i uruchomienie:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$ javac --enable-preview --release 14 NativeProc.java
Note: NativeProc.java uses preview language features.
Note: Recompile with -Xlint:preview for details.
$ java --enable-preview NativeProc
(...)

PID: 8044,
Command: [command unknown]
Arguments: []
Start time: 2021-02-15T07:15:26.940Z
User: root

PID: 8090,
Command: /usr/lib/jvm/java-14-openjdk-amd64/bin/java
Arguments: [--enable-preview, NativeProc]
Start time: 2021-02-15T07:16:43.630Z
User: karma

There are 260 processes

Podobne artykuły

Mogą Cię również zainteresować: