为什么在 java 中加载 类 时委托
Why delegate when loading classes in java
如 javase 7 文档所述
The ClassLoader class uses a delegation model to search for classes
and resources. Each instance of ClassLoader has an associated parent
class loader. When requested to find a class or resource, a
ClassLoader instance will delegate the search for the class or
resource to its parent class loader before attempting to find the
class or resource itself.
为什么 ClassLoader 将 class 或资源的搜索委托给其父级?这样做的目的或好处是什么?
class加载委派有几个正当理由。我根据他们的优先级列出了他们(根据我的理解):
安全
Java 中有某些 class 不应该被弄乱。通过使用 parent-first 委托模型,JVM 可以确保它只执行那些 classes 而不是由自定义 classloaders.
加载的那些
避免重复 class 个实例
Class加载是一个代价高昂的操作,因为它需要从外部存储或网络读取数据、解析字节码、分配内存等。所以限制 JVM 只加载一次 classes 是原因之一。通过使用 parent-first 规则形成 classloader 层次结构将实现这一点。
Class 范围
有一些class是Java的核心部分,比如java.lang.*
。这些 classes 是 Java 语言的一部分,将在几乎所有地方使用。由于 class 由其完全限定名称以及加载该 class 的 classloader 唯一标识,因此有一个 classloader 来加载这样的 classes。因此 bootstrap 和扩展 classloader 会处理这个问题。
此外,通过在顶层加载 classes 和资源,比在 classloader 层次结构的底部加载更广泛的范围。
如 javase 7 文档所述
The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader. When requested to find a class or resource, a ClassLoader instance will delegate the search for the class or resource to its parent class loader before attempting to find the class or resource itself.
为什么 ClassLoader 将 class 或资源的搜索委托给其父级?这样做的目的或好处是什么?
class加载委派有几个正当理由。我根据他们的优先级列出了他们(根据我的理解):
安全
Java 中有某些 class 不应该被弄乱。通过使用 parent-first 委托模型,JVM 可以确保它只执行那些 classes 而不是由自定义 classloaders.
加载的那些避免重复 class 个实例
Class加载是一个代价高昂的操作,因为它需要从外部存储或网络读取数据、解析字节码、分配内存等。所以限制 JVM 只加载一次 classes 是原因之一。通过使用 parent-first 规则形成 classloader 层次结构将实现这一点。
Class 范围
有一些class是Java的核心部分,比如java.lang.*
。这些 classes 是 Java 语言的一部分,将在几乎所有地方使用。由于 class 由其完全限定名称以及加载该 class 的 classloader 唯一标识,因此有一个 classloader 来加载这样的 classes。因此 bootstrap 和扩展 classloader 会处理这个问题。
此外,通过在顶层加载 classes 和资源,比在 classloader 层次结构的底部加载更广泛的范围。