我已经检测了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"的内容。那么,类加载器在内部是如何工作的呢?
类是延迟加载的。
您可以通过编写代码以在静态初始化器中打印到控制台来查看这一点。
当特定类装入器装入的任何代码首次使用类引用时,JVM 会从当前线程中的装入器请求Class
。如果父类装入器尚未装入具有完全限定名的类,那么当前类装入器将定义该类(或抛出异常(。
在早期,小程序会为每个类文件建立网络连接。