Что такое метод-тип подписи типа JVM - PullRequest
0 голосов
/ 02 октября 2018

В соответствии со спецификацией JVM , существует 11 сигнатур типа JVM, одна из которых - «тип метода», я его никогда не вижу.что это ?

1 Ответ

0 голосов
/ 03 октября 2018

Как указывает Хольгер, документ, на который вы ссылаетесь, предназначен для собственного интерфейса Java (JNI), а не для спецификации JVM.

Подпись метода используется JNI для определения (более точного определения), какой методиспользовать.Как указано в документе, это тот же подход, который используется JVM.

Сигнатура метода позволяет уникально идентифицировать метод.Язык Java имеет концепцию перегрузки методов, то есть вы можете иметь несколько методов в классе с одним и тем же именем.То, как компилятор различает их, использует сигнатуру метода, которая состоит из имени метода, параметров универсального типа (если есть) и количества и типа его аргументов.Важно понимать, что только эти значения используются для подписи.Некоторые другие аспекты определения метода не рассматриваются:

  • Тип возвращаемого значения
  • Брошенные исключения
  • Будь то статический метод или метод экземпляра
  • Модификатор доступа (публичный, пакетный, защищенный, приватный)

Это означает, что вы не можете иметь два метода с одинаковым именем, которые имеют одинаковое количество и типы аргументов, даже если тип возвращаемого значения отличается илибросай разные исключения.(См. Раздел 8.4.2 Спецификации языка Java для более подробной информации.)

Однако внутри JVM сигнатура метода действительно включает тип возврата (см. Раздел 4.3.3 Спецификации виртуальной машины Java для получения более подробной информации).подробно).

В JNI сигнатура метода определяется с использованием синтаксиса на странице, на которую вы ссылаетесь.

Давайте воспользуемся примером метода на этой странице:

long f (int n, String s, int[] arr) { ... }

Представление JVM этого будет

(ILjava/lang/String;[I)J 

Чтобы использовать это в JNI, у нас может быть что-то вродеthis:

jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "f", "(ILjava/lang/String;[I)J");

Как вы можете видеть, мы передаем сигнатуру типа метода в качестве параметра методу GetMethodID, чтобы JNI (и JVM) могли решить, для какого метода возвращать идентификатор.

...