为什么sun.misc.Launcher $ AppClassLoader.loadClass出现在堆栈中

时间:2018-10-18 23:14:25

标签: java jvm bytecode classloading

我已经检测了JDK和应用程序。记录入口和出口点以进行调用图构建。

调用图看起来像

  

sun.misc.Launcher $ AppClassLoader.loadClass-> com.example.Main.main
  -> sun.misc.Launcher $ AppClassLoader.loadClass-> com.example.Foo.foo

源代码

public class Main{
public static void main(String[] args){
  Foo.foo()
}
}

public class Foo{
  public static void foo(){};
}

这必须是类加载器的工作方式,但是我看不到字节码中显示的任何内容来表明调用站点“ sun.misc.Launcher $ AppClassLoader.loadClass”。那么,类加载器如何在内部工作?

1 个答案:

答案 0 :(得分:1)

类被延迟加载。

您可以通过编写代码以在静态初始化程序中将其打印到控制台来查看。

由特定类加载器第一次加载任何类使用类引用时,JVM会在当前线程中从加载器请求Class。如果父类加载器尚未加载完全限定名称的类,则当前类加载器将对其进行定义(或引发异常)。

在早期,小程序会为每个类文件建立网络连接。