两次调用Class.forName()

时间:2016-06-16 08:06:01

标签: java class classloader

我目前正在阅读类加载器及其层次结构功能。 如果我打电话给下面的代码 -

ClassA a=  Class.forName("com.test.ClassA")

根据我的理解,现在它将在Application Class加载器的帮助下初始化并加载到内存中。 我有以下问题:

  1. 如果我再次拨打电话,会发生什么情况?是否会在内存中为“ClassA”创建新实例,还是会返回相同的加载类引用?
  2. 如果是,按照javarevisited的post,“通过使用单独的ClassLoader,您还可以从多个来源加载相同的类,并将它们视为JVM中的不同类” 会有什么用呢?

2 个答案:

答案 0 :(得分:4)

  1. 你会得到同一个班级。试试吧。再次加载并检查a1 == a2
  2. 此功能最常用于app服务器:您可以在单个服务器中部署多个Web应用程序,并且所有Web应用程序都可以使用相同的类。但他们不应该共享静态变量。如果一个人使用库1.0中的类Foo,另一个使用库2.0中的类Foo,则应该没有问题。因此需要使用不同的类加载器加载相同的类。

答案 1 :(得分:1)

  1. 只有在您致电:

    时才会创建新实例

    ClassA inst = new ClassA();

  2. 如果调用Class.forName,则类定义(元数据和字节码)将加载到JVM中,并加载到名为HEAP的托管内存的特殊部分中。通常,应用程序使用此函数将类预加载到JVM中,以便稍后在应用程序需要时没有延迟。

    1. 例如,使用hotdeploy。您正在调试java Web服务器。你发现了一个错误,只想改变(重新加载)一个类,而不是整个应用程序。这里的重点也是"不同的类装载机"。这意味着java中的库可以从不同的源加载:jar,war(存档),数据库和网络。将其与Windows的COM模型进行比较,其中库必须位于同一文件夹或/ system32 /文件夹中。