jvm如何在首次使用类时检查类是否已加载



问题

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类的classloader加载,但有了#1,MyObject类会在#2加载吗?jvm是如何判断的?

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新