gpt4 book ai didi

java - 第一次使用类时,jvm 如何检查类是否已加载

转载 作者:行者123 更新时间:2023-12-02 08:50:47 24 4
gpt4 key购买 nike

问题

当jvm运行以下代码时

MyObject o=new MyObject() //first access MyObject

我们知道jvm将开始加载MyObject的类,但我想知道jvm如何知道MyObject没有加载。

动机

我想知道因为 jvm 是否运行这些代码

public class Main{
public static void main(){
ClassLoader myLoader = new ClassLoader(null) {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// omitted here
}
}
myLoader.loadClass("MyObject"); //#1
MyObject o=new MyObject() //#2
}
}

我们知道如果没有#1,MyObject会被Main类的类加载器加载,但是有了#1,MyObject的类会在#2加载,jvm是如何判断的?

最佳答案

每个ClassLoader 都保存迄今为止已加载的类的列表。

如果两个不同的ClassLoader加载同名的类,则运行时会将它们视为两个单独的不相关的类。这很有用,因为它允许同一类的不同版本在运行时共存。例如,我们可以将不同团队开发的多个Web应用程序部署到同一个JVM中,每个应用程序都有自己的库,从而使各个应用程序的开发人员无需协调所使用的库的版本。

在您的情况下,如果我们在类 Main 中执行 new MyObject() ,则加载类 Main 的类加载器会被要求加载类MyObject。这就是系统ClassLoader,它对您的myLoader一无所知。因此,系统类加载器将再次加载MyObject类。

您可以通过向 MyObject 添加静态初始值设定项来验证这一点:

class MyObject {
static {
System.out.println("class MyObject has been loaded");
}
}

关于java - 第一次使用类时,jvm 如何检查类是否已加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60792341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com