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