Точка останова хита Hashmap.put() простая программа Hello World
Программа проста:
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, и они все одинаковы.
Ответы
Ответ 1
Вот трассировка стека, которую я получил при воспроизведении вашего сценария.
Когда приложение запускается Eclipse, оно не просто вводит главную функцию. Перед созданием экземпляра ваш класс должен быть загружен в JVM. Для этого будет использоваться Class Loader.
В вашем случае URLClassLoader имеет член типа URLClassPath, который использует объект HashMap.
![введите описание изображения здесь]()
Ответ 2
Это связано с тем, как Eclipse запускает приложения.
Класс Eclipse LauncherHelper
, запускающий приложение (HelloWorld), вызывает URLClassLoader
и множество других вещей. URLClassLoader использует HashMaps
, HashTables
и т.д.
Ответ 3
Поскольку вы уже используете отладчик, вы также можете увидеть кадры, которые показывают, где был вызван метод put
. В IntelliJ это выглядит так:
![frames]()
Как вы можете видеть здесь, метод вызывается, когда 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: попытайтесь ознакомиться с вашим отладчиком, это поможет вам понять, почему вызываются определенные методы и какой класс/метод выполняет вызов.