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

问题描述 投票:0回答:2

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

java jvm bytecode classloading
2个回答
1
投票

类是延迟加载的。

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

特定类加载器加载的任何代码第一次使用类引用时,JVM 会从当前线程中的加载器请求

Class
。如果父类加载器尚未加载完全限定名称的类,则当前类加载器将定义它(或抛出异常)。

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


0
投票

看一下: https://www.infoworld.com/article/3700054/all-about-java-class-loaders.html JVM 中至少有 3 个不同的类加载器 - 如果您想使用自己的类加载器,则更多。 简而言之,加载需要新类的类的类加载器调用其类加载器,类加载器又调用其类加载器等,如果顶级类加载器找不到它,它会沿着层次结构返回。 上面提到的链接提供了一张漂亮的图片。

© www.soinside.com 2019 - 2024. All rights reserved.