返回

类的加载(下)-分类的加载

IOS

分类加载

在上一小节,我们了解了类加载的一般流程和双亲委派模型。在这小节,我们将重点介绍分类加载,它是Java类加载机制的核心思想。

分类加载是一种将类加载器组织成树形结构的机制,其中每个类加载器都有一个父类加载器,根类加载器是引导类加载器。分类加载机制的主要目的是隔离不同的类,防止它们相互干扰。

分类加载器:

  • 引导类加载器:它是根类加载器,负责加载Java核心库中的类。
  • 扩展类加载器:它是引导类加载器的子类加载器,负责加载位于$JAVA_HOME/jre/lib/ext目录中的类。
  • 系统类加载器:它是扩展类加载器的子类加载器,负责加载位于$JAVA_HOME/jre/lib目录中的类。

当一个类被加载时,类加载器首先会尝试从其父类加载器中加载该类。如果父类加载器无法加载该类,则类加载器会尝试从自己的类路径中加载该类。如果类加载器仍无法加载该类,则会抛出ClassNotFoundException异常。

分类加载器机制具有以下优点:

  • 安全性:分类加载器机制可以隔离不同的类,防止它们相互干扰。例如,一个恶意类可以被加载到一个单独的类加载器中,从而防止它对其他类造成破坏。
  • 可扩展性:分类加载器机制可以很容易地扩展,以支持新的类加载器。例如,我们可以创建一个新的类加载器来加载自定义的类。
  • 性能:分类加载器机制可以提高类的加载性能。当一个类被加载时,类加载器只需要搜索自己的类路径,而无需搜索整个类路径。

ClassLoader

ClassLoader是Java类加载机制的核心类,它负责加载Java类。ClassLoader类提供了以下主要方法:

  • loadClass():该方法根据类名加载一个类。
  • findClass():该方法查找一个类,但不加载它。
  • defineClass():该方法定义一个类。

Java反射

Java反射是一种在运行时检查和修改类的机制。反射机制允许我们获取类的信息,修改类的属性和方法,甚至创建新的类。

Java反射的主要类是Class类,它代表一个Java类。Class类提供了以下主要方法:

  • getName():该方法返回类的名称。
  • getFields():该方法返回类的所有属性。
  • getMethods():该方法返回类的所有方法。
  • newInstance():该方法创建一个类的实例。

java.lang.Class

java.lang.Class类是Java反射的核心类,它代表一个Java类。java.lang.Class类提供了以下主要方法:

  • getName():该方法返回类的名称。
  • getFields():该方法返回类的所有属性。
  • getMethods():该方法返回类的所有方法。
  • newInstance():该方法创建一个类的实例。

总结

分类加载是Java类加载机制的核心思想,它可以隔离不同的类,防止它们相互干扰。ClassLoader类是Java类加载机制的核心类,它负责加载Java类。Java反射是一种在运行时检查和修改类的机制,它允许我们获取类的信息,修改类的属性和方法,甚至创建新的类。