Java 调用Class.forName()两次

Java 调用Class.forName()两次,java,class,classloader,Java,Class,Classloader,我目前正在阅读类加载器及其层次结构功能。 如果我在以下代码中调用- ClassA a= Class.forName("com.test.ClassA") 根据我的理解,现在它将在应用程序类加载器的帮助下初始化并加载到内存中。 我有以下问题: 如果我再次调用上述代码,会发生什么?是否会在内存中为“ClassA”创建新实例,还是返回相同的已加载类引用 如果是,根据JavaRetrieved的这一部分,“通过使用单独的类加载器,您还可以从多个源加载相同的类,它们将在JVM中被视为不同的类。” 它有

我目前正在阅读类加载器及其层次结构功能。 如果我在以下代码中调用-

ClassA a=  Class.forName("com.test.ClassA")
根据我的理解,现在它将在应用程序类加载器的帮助下初始化并加载到内存中。 我有以下问题:

  • 如果我再次调用上述代码,会发生什么?是否会在内存中为“ClassA”创建新实例,还是返回相同的已加载类引用
  • 如果是,根据JavaRetrieved的这一部分,“通过使用单独的类加载器,您还可以从多个源加载相同的类,它们将在JVM中被视为不同的类。” 它有什么用
  • 你会上同样的课。试试看。再次加载它并检查
    a1==a2
  • 此功能最常见的用法可能是应用程序服务器:您可以在单个服务器中部署多个web应用程序,并且所有应用程序都可以使用相同的类。但它们不应该共享静态变量。如果一个使用库1.0中的类Foo,另一个使用库2.0中的类Foo,那么应该没有问题。因此,需要使用不同的类装入器装入同一个类
  • 仅当您调用以下命令时,才会创建新实例:

    ClassA inst=新的ClassA()

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

  • 例如,使用hotdeploy。您正在调试java web服务器。您发现一个错误,只想更改(重新加载)一个类,而不是整个应用程序。这里的重点也是“不同的类装入器”。这意味着java中的库可以从不同的来源加载:jar、war(归档)、数据库、网络。将此与Windows的COM模型进行比较,其中库必须位于同一文件夹或/system32/文件夹中
    顺便说一句:
    Class.forName
    返回类型为
    Class
    的对象,而不是在forName中传递的类的实例
    ClassA=Class.forName(“com.test.ClassA”)
    不正确。它应该是
    Class a=Class.forName(“com.test.ClassA”)