Jak maszyna wirtualna języka Java obsługuje wywoływanie i zwracanie metod

W tym miesiącu Under The Hood skupia się na wywołaniu metod i powrocie do wirtualnej maszyny Java (JVM). Opisuje cztery sposoby wywoływania metod Java (i natywnych), podaje przykładowy kod, który ilustruje cztery sposoby i obejmuje odpowiednie kody bajtowe.

Wywołanie metody

Język programowania Java udostępnia dwa podstawowe rodzaje metod: metody instancji i metody klasowe (lub statyczne). Różnica między tymi dwoma rodzajami metod jest następująca:

  1. Instancemetody wymagają wystąpienia, zanim będą mogły zostać wywołane, podczas gdy classmetody nie.
  2. Instancemetody używają dynamicznego (późnego) wiązania, podczas gdy classmetody używają statycznego (wczesnego) wiązania.

Kiedy maszyna wirtualna Java wywołuje metodę klasy, wybiera metodę do wywołania na podstawie typu odwołania do obiektu, który jest zawsze znany w czasie kompilacji. Z drugiej strony, gdy maszyna wirtualna wywołuje metodę instancji, wybiera metodę do wywołania na podstawie aktualnej klasy obiektu, która może być znana tylko w czasie wykonywania.

Maszyna JVM używa dwóch różnych instrukcji, pokazanych w poniższej tabeli, w celu wywołania tych dwóch różnych rodzajów metod: invokevirtual dla instancemetod i invokestatic dla classmetod.