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

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

问题

当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是如何进行判断的?

java classloader classloading
1个回答
1
投票

每个ClassLoader保留到目前为止已加载的类的列表。

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

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

您可以通过向MyObject添加静态初始化程序来验证这一点:

class MyObject {
    static {
        System.out.println("class MyObject has been loaded");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.