程序很简单:
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);
put()
然后我开始调试HelloWorld.class,它将运行到HashMap中的断点。我很奇怪它在HashMap中如何遇到#include <stdio.h>
void sample_check(void)
{
printf("INFO: Function sample_check() called.\n");
}
?
我尝试过HashMap,Hashtable,它们都是一样的。
答案 0 :(得分:17)
以下是我在重现场景时获得的堆栈跟踪。
当Eclipse启动应用程序时,它不会简单地进入主函数。在创建实例之前,需要将类加载到JVM中。为此,将使用类加载器。
在您的情况下,URLClassLoader有一个URLClassPath类型的成员,使用HashMap对象。
答案 1 :(得分:9)
这是因为Eclipse启动应用程序的方式。
运行应用程序的Eclipse LauncherHelper
类(HelloWorld)调用URLClassLoader
以及其他大量内容。 URLClassLoader使用HashMaps
,HashTables
等
答案 2 :(得分:4)
由于您已经在使用调试器,因此您还应该能够看到显示调用put
方法的位置的帧。在IntelliJ中它看起来像这样:
正如您在此处所见,当JVM尝试加载某个类时调用该方法:此处它是您的HelloWorld
类。它可以在那里调用main
方法。
由于JVM刚刚启动,它需要填充HashMap<String, URLClassPath.Loader> lmap
类中的某个sun.misc.URLClassPath
。此映射包含已使用资源的条目,例如已使用的jar文件(例如Java安装中的jar文件)或.class
位置,例如项目的“bin”目录。
然后在应用程序的运行时使用它。
但是也会使用Map
,然后JVM加载java.security.Permissions
中具有Map<Class<?>, PermissionCollection> permsMap
的“权限”。
如您所见,put
方法的调用与您自己的应用程序的内容无关。它仅用于为Java环境和应用程序运行时加载基本内容。
顺便说一句:尝试熟悉您的调试器,它将帮助您理解为什么调用某些方法以及执行该调用的类/方法。