Точка останова хита Hashmap.put () простая программа Hello World

17

Программа проста:

public class HelloWorld {
    public static void main(String args[]){
       System.out.println("Hello World");
    }
}

Теперь я установил точку останова в функцию put(K key, V value) в HashMap.class

public V put(K key, V value) {
    if (table == EMPTY_TABLE) {
        inflateTable(threshold);
    }
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);

, а затем я начинаю отладку HelloWorld.class, он будет работать в точке останова в HashMap. Мне странно, что он может столкнуться с put() в HashMap?
Я попробовал HashMap, Hashtable, и они все одинаковы.     

задан Flory Li 06.12.2015 в 13:02
источник
  • какая у вас IDE? –  tharindu_DG 06.12.2015 в 13:06
  • Проверка функции вызывает стек в режиме отладки, и вы увидите, какая функция вызывает put. –  ctomek 06.12.2015 в 13:07
  • Странно, но даже я только что проверил сейчас ... я предполагаю, что при загрузке класса ... должны быть некоторые классы, которые вызывают HashMap ... HahsMap вызывается перед вызовом метода System.out.println () –  Naruto 06.12.2015 в 13:10
  • моя IDE - это MyEclipse. –  Flory Li 06.12.2015 в 13:11
  • Под капотом никакая программа Java не проста. Существует много механизмов, связанных с настройкой внутренней среды для любой программы. –  Pete Becker 06.12.2015 в 14:37

3 ответа

17

Вот трассировка стека, которую я получил при воспроизведении вашего сценария.

Когда приложение запускается Eclipse, он не просто вводит главную функцию . Перед созданием экземпляра ваш класс должен быть загружен в JVM. Для этого будет использоваться Class Loader .

В вашем случае URLClassLoader имеет член типа URLClassPath, который использует объект HashMap .

    

ответ дан VAndrei 06.12.2015 в 13:34
  • Если URLClassLoader использует HashMap, как он загружает HashMap.class? –  corsiKa 06.12.2015 в 21:21
  • @corsiKa Спасибо. Я исправил. –  VAndrei 06.12.2015 в 21:35
9

Это связано с тем, как Eclipse запускает приложения.

Класс Eclipse LauncherHelper , запускающий приложение (HelloWorld), вызывает URLClassLoader и множество других вещей. URLClassLoader использует HashMaps , HashTables и т. Д.

    
ответ дан Gergely Bacso 06.12.2015 в 13:24
4

Поскольку вы уже используете отладчик, вы также можете увидеть фреймы, которые показывают, где был вызван метод put . В IntelliJ это выглядит так:

Как вы можете видеть здесь, метод вызывается, когда JVM пытается загрузить определенный класс: здесь это ваш класс HelloWorld . Он делает это, чтобы вызвать метод main .

Поскольку JVM только что начал, ему необходимо заполнить определенный HashMap<String, URLClassPath.Loader> lmap в классе sun.misc.URLClassPath . Эта карта содержит записи для используемых ресурсов, таких как используемые файлы jar (например, файлы jar из установки Java) или .class , такие как каталог "bin" вашего проекта. Он будет использоваться во время выполнения вашего приложения.

Но также будет использоваться Map , тогда JVM загрузит «разрешения» в java.security.Permissions , у которого Map<Class<?>, PermissionCollection> permsMap .

Как вы можете видеть, вызов метода put не имеет никакого отношения к содержимому вашего собственного приложения. Он просто используется для загрузки базового материала для среды Java и среды выполнения приложения.

Btw: попытайтесь ознакомиться с вашим отладчиком, это поможет вам понять, почему вызываются определенные методы и какой класс / метод выполняет вызов.

    
ответ дан Tom 06.12.2015 в 13:43