1

我已经检测了 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”的内容。那么,类加载器在内部是如何工作的呢?

4

1 回答 1

1

类是延迟加载的。

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

由特定类加载器加载的任何代码第一次使用类引用时,JVM 会Class从当前线程中的加载器请求。如果父类加载器没有加载完全限定名的类,那么当前类加载器将定义它(或抛出异常)。

在早期,applet 会为每个类文件建立一个网络连接。

于 2018-10-19T00:05:01.857 回答