Что такое внутренняя идентификация метода Java?

Как известно, в Java имя метода недостаточно для различения разных методов.

Я думаю (может быть неправильно), чтобы отличить метод, ему нужна следующая информация:

(className, methodName, methodParameters)

В дальнейшем,

  • как определить метод более эффективно внутри страны?
  • Я слышал о "методе ID". Означает ли это, что между вышеуказанной тройкой и целым числом существует сопоставление, поэтому JVM после синтаксического анализа использует только идентификатор метода?
  • Если да, находится ли он в таблице символов?

Спасибо!

4 ответа

Решение

Это структура CONSTANT_NameAndType_info, указывающая на дескриптор метода.

Он в значительной степени состоит из имени метода, типов параметров и (несколько удивительно) возвращаемого типа.

Я не очень хорошо понимаю, что вы пытаетесь сделать, но я думаю, что есть несколько возможных ответов:

  • Возможно, вас заинтересуют дескрипторы метода JNI, один из различных форматов строк, используемых внутри JVM (и библиотеками JNI) для идентификации элементов Java.

  • Трудно понять, о чем ты говоришь. "Идентификатор метода" может быть ссылкой для java.lang.reflect.Method объект, или может быть дескриптором метода, упомянутого ниже, или любой другой вещью. Где вы читали об этом?

  • Я сомневаюсь, что внутри JVM есть такая таблица. Я имею в виду, я сомневаюсь, что существует глобальная таблица, потому что почти всегда вы извлекаете метод из класса, даже когда имеете дело с ним внутри JVM, поэтому разумно полагать, что метод хранится в классе. Аналогично, когда мы используем рефлексию для извлечения метода:

    Class clazz = String.class;
    Method method = clazz.getDeclaredMethod("charAt", Integer.TYPE);
    System.out.println(method.getName());
    

Обратите внимание, что я спрашиваю класс String для метода, вместо того, чтобы просить некоторый класс утилит, чтобы дать мне метод charAt, который получает int и из класса String,

Другими словами, ваш идентификационный кортеж почти правильный - у него просто нет класса:

(methodName, methodParameters)

и вместо извлечения метода из JVM, передающего класс, а затем имя метода и затем типы параметров, вы извлекаете метод непосредственно из класса, давая классу имя метода и типы параметров. Тонкая разница, конечно, но я думаю, что это то, что вас интересует.

Это очевидно даже в дескрипторах JNI, о которых я упоминал ниже. Например, метод

long f(int i, Class c);

представлен следующим дескриптором:

"(ILjava/lang/Class;)J"

Обратите внимание, что нет ссылки на класс метода.

Отличная документация по формату файлов классов (уже указанная @Lawence) может дать вам некоторое представление. Я рекомендую вам прочитать его полностью.

Java всегда различает свои языковые элементы по их полностью определенным именам.

Предположим, у вас есть метод myMethod(int a, int b) в классе MyClass который лежит в упаковке com.mypackage тогда java идентифицирует метод с именем com.mypackage.MyClass.myMethod(int a , int b),

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

Он учитывает, какой загрузчик классов использовался для загрузки конкретного класса, содержащего метод, на который вы ссылаетесь. В Java есть четыре типа загрузчиков классов. Вы можете прочитать документацию для java.lang.Thread класс для этого.

1) Как определить метод более эффективно внутри страны?

Внутренне к чему? Есть много мест, где метод может быть "идентифицирован" "внутренне". В компиляторе байт-кода, JIT-компиляторе, загрузчике классов / компоновщике, представлении файла классов, API отражения, отладчике и так далее. Каждый из них имеет различные проблемы эффективности.

2) Я слышал о "методе ID". Означает ли это, что между вышеуказанной тройкой и целым числом существует сопоставление, поэтому JVM после синтаксического анализа использует только идентификатор метода?

Идентификатор метода используется в представлении файла классов и может использоваться любым, основанным на этом, в том числе загрузчиком / компоновщиком классов, JIT-компилятором и отладчиком.

JVM не анализирует код Java.

3) Если это так, находится ли он в таблице символов?

Это может сделать. Это зависит от того, что вы подразумеваете под "таблицей символов". Помните, что существует множество мест, где требуется идентификация метода на протяжении всего жизненного цикла класса. Например, API отражения Java требуют информацию о методе для реализации таких методов, как getDeclaredMethod(...) и различные методы Method,

Другие вопросы по тегам