Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么loadClass方法中需要findLoadedClass方法调用?_Java - Fatal编程技术网

Java 为什么loadClass方法中需要findLoadedClass方法调用?

Java 为什么loadClass方法中需要findLoadedClass方法调用?,java,Java,当我在做一些关于类加载的实验时,我编写了如下的简单代码 CustomClass customClass1 = new CustomClass(); CustomClass customClass2 = new CustomClass(); 并注意到,对于第一个实例创建,它转到loadClass方法并调用findLoadedClass方法(如果当前加载程序已经加载)。事实并非如此,它继续进行并加载了类。 但对于第二个实例,它并没有转到loadClass方法,而是直接创建了该方法的

当我在做一些关于类加载的实验时,我编写了如下的简单代码

    CustomClass customClass1 = new CustomClass();
    CustomClass customClass2 = new CustomClass();
并注意到,对于第一个实例创建,它转到loadClass方法并调用findLoadedClass方法(如果当前加载程序已经加载)。事实并非如此,它继续进行并加载了类。 但对于第二个实例,它并没有转到loadClass方法,而是直接创建了该方法的实例


所以我这里的问题是,当它创建第二个实例时,它已经是新的,因为类已经被加载了,所以它没有转到loadClass方法。因此,当jvm现在已经知道哪个类已加载,哪个不是时,那么需要在loadClass方法中调用findLoadedClass方法。

来自Java虚拟机规范(适用于Java 8),第5.3.2节:

以下步骤用于使用用户定义的类加载器L加载并由此创建由N表示的非数组类或接口C

首先,Java虚拟机确定L是否已被记录为由N表示的类或接口的初始加载程序。如果是,则该类或接口为C,无需创建类

否则,Java虚拟机调用L上的loadClass(N)。调用返回的值是创建的类或接口C。Java虚拟机随后记录L是C的初始加载程序(§5.3.4)

这解释了为什么在您的示例中不再调用
loadClass
。但这并不意味着对于这个特定类的fqn,
loadClass
永远不会在这个特定的类加载器上被调用。例如,当一些其他类加载器充当初始类加载器时,它可能由于类加载委托而发生,但将对其
loadClass
的调用委托给该类加载器的
loadClass
。因此调用
findLoadedClass