java - 为什么在java中加载类时委托(delegate)

标签 java 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 将类或资源的搜索委托(delegate)给它的父类?这样做的目的或好处是什么?

最佳答案

类加载委托(delegate)有几个正当理由。我根据他们的优先级列出了他们(根据我的理解):

安全

Java 中的某些类不应被混淆。通过父优先委派模型,JVM 可以确保它只执行那些类,而不是自定义类加载器加载的类。

避免重复的类实例

类加载是一项代价高昂的操作,因为它需要从外部存储或网络读取数据、解析字节码、分配内存等。所以限制 JVM 只加载一次类是原因之一。通过使用父优先规则形成类加载器层次结构将实现这一点。

类范围

有些类是Java 的核心部分,例如java.lang.*。这些类是Java语言的一部分,几乎所有地方都会用到。由于类由其完全限定名称以及加载该类的类加载器唯一标识,因此使用单个类加载器来加载此类类非常重要。因此, Bootstrap 和扩展类加载器会处理这个问题。 此外,通过在顶层加载类和资源,比在类加载器层次结构的底部加载更广泛的范围。

关于java - 为什么在java中加载类时委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643204/

相关文章:

java - 如何在现代 JDeveloper/Weblogic/ADF 中为 JSP 页面启用 debug_mode

java - war 的 lib 和 Ear 的 lib 之间的 Wildfly 类加载器问题

java - 如何限制用户在swt文本框中输入某些字符

具有不可序列化部分的 Java 序列化

java - Java类实例化-内存内部有什么?

java - 使用 .getClassLoader().getResource() 从目录加载所有文件

java - 向 Tomcat 添加更高优先级的 webapp 类加载器

java - NoClassDefFoundError: A (错误的名字: A)

java - 在 Java 中的 Apache Spark 1.4 中向数据框添加一列

java - 使用 ImageGetter 从 HTML 抓取图像时出现内存不足错误