`

ClassLoader小结

    博客分类:
  • JVM
 
阅读更多

负责装载class文件;这个文件来源可能是压缩包、网络、运行时编译出的或者自动生成的class文件,jvm spec没有规定必须从什么地方加载。

 

jvm中默认提供了三种系统类加载器:

1)、启动类加载器Bootstrap ClassLoader,负责加载%JAVA_HOME%\jre\lib目录下的包,或 -Xbootclasspath 选项指定的jar包装入工作。

2)、扩展类加载器Ext ClassLoader,负责加载%JAVA_HOME%\jre\lib\ext目录下的包,或者在java.ext.dirs系统变量锁指定的路径中的所有类库

3)、应用程序类加载器App ClassLoader,负责加载用户classpath中的包

ClassLoader是双亲委派模型,除了Bootstrap ClassLoader外每个classloader都有自己的父加载器,每个加载器在加载某个类之前,先委托父加载器在其相关的目录加载,如果加载不到,则自己加载。

 

自定义类加载器加载一个类的步骤

ClassLoader 类加载逻辑分析, 以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程:

 

// 检查类是否已被装载过  
Class c = findLoadedClass(name);  
if (c == null ) {  
     // 指定类未被装载过  
     try {  
         if (parent != null ) {  
             // 如果父类加载器不为空, 则委派给父类加载  
             c = parent.loadClass(name, false );  
         } else {  
             // 如果父类加载器为空, 则委派给启动类加载加载  
             c = findBootstrapClass0(name);  
         }  
     } catch (ClassNotFoundException e) {  
         // 启动类加载器或父类加载器抛出异常后, 当前类加载器将其  
         // 捕获, 并通过findClass方法, 由自身加载  
         c = findClass(name);  
     }  
}  

 

 

为什么要使用这种双亲委托模式呢?

  1. 因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
  2. 考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的ClassLoader。

 

分享到:
评论

相关推荐

    java 技巧小结荟萃

    ### Java技巧小结荟萃 #### Javadoc API 文件产生器 Javadoc 是一款非常重要的工具,主要用于生成文档,能够从源代码注释中提取出有用的文档信息。这不仅有助于提高代码的可读性,还方便其他开发人员快速理解类、...

    Spring.3.x企业应用开发实战(完整版).part2

    1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 ...

    Spring3.x企业应用开发实战(完整版) part1

    1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 ...

    AOP的实现机制

    **3.1.3 小结** 动态代理的主要优点在于其灵活性,能够轻松地为任何实现了接口的类添加额外的行为。但需要注意的是,只有实现了接口的类才能使用动态代理。 ##### 3.2 动态字节码生成 动态字节码生成技术允许在...

    详解SpringBoot配置devtools实现热部署

    小结 Spring Boot 的 DevTools 模块可以帮助我们实现热部署,提高开发者的开发效率,无需手动重启 Spring Boot 应用。通过配置 DevTools,我们可以实现页面热部署、类文件热部署和对属性文件的热部署。

    J2EE与J2SE路径获取

    #### 小结 无论是J2EE还是J2SE项目,路径获取都是开发过程中必不可少的一部分。合理选择路径获取方法,不仅能够提高程序的可移植性和可维护性,还能够避免因路径问题导致的各种异常情况。以上介绍的方法涵盖了大...

    Java 2平台安全技术-结构,API设计和实现

    3.12 小结 67 第4章 安全结构的使用 70 4.1 安装JDK1.2 70 4.2 策略配置 71 4.2.1 配置系统型和用户专用型策略 71 4.2.2 配置应用程序专用型策略 72 4.2.3 配置一个可选Policy类的实现 72 4.2.4 缺省的策略文件格式 ...

    Java深度历险CH02

    #### 小结 《Java深度历险》第二章深入介绍了Java的类别加载器及其在实现动态性方面的重要作用。通过理解类别加载器的工作机制,开发者不仅能够更好地利用Java的这一特性,还可以开发出更加灵活、可扩展的应用程序...

    java文件的加载

    #### 四、小结 通过上述介绍可以看出,在Java中加载文件的方式多种多样,开发者可以根据实际需求选择最适合的方法。无论是基于Java本身的类加载机制还是通过Spring等框架提供的便捷方式,都能够有效地实现资源文件...

    JAVA 2平台安全技术-结构,API设计和实现

    3.12 小结 67 第4章 安全结构的使用 70 4.1 安装JDK1.2 70 4.2 策略配置 71 4.2.1 配置系统型和用户专用型策略 71 4.2.2 配置应用程序专用型策略 72 4.2.3 配置一个可选Policy类的实现 72 4.2.4 缺省的策略文件格式 ...

    Java Resource路径整理总结

    而获取 ClassLoader 的方式很多,比如 Thread.currentThread().getContextClassLoader()、clazz.getClassLoader()、ClassLoader.getSystemClassLoader() 等。 当前用户目录 当前用户目录是 Java 中另一个重要的...

    Springboot读取templates文件html代码实例

    小结 因此,我们可以通过使用@Controller注解标注的控制器类,并使用@RequestMapping注解标注的方法来读取templates文件html代码实例。在上面的示例代码中,我们使用了InputStreamReader和PrintWriter来读取和写入...

    Spring_3.x企业应用开发实战 目录

    - **1.12 小结** - **总结**:介绍了 Spring 框架的基本概念、新功能以及生态系统。 #### 第2章 快速入门 - **2.1 实例功能概述** - **实例功能**:通过一个实际的例子来展示 Spring 框架的应用。 - **2.2 环境...

    传智播客毕向东Java基础课堂笔记

    #### 小结 本章节概述了Java的基础概念和技术要点,包括Java的特点、运行机制、开发环境的搭建、注释、标识符、变量和命名规则等内容。这些基础知识对于深入学习Java至关重要,也是后续章节讨论更复杂主题的基础。...

    Java反射总结:入门进阶到使用

    **三、反射小结与进阶操作** 3.1 对于类加载器、构造器、Method、Field的进阶操作,包括: - 类加载器操作:如自定义类加载器,控制类的加载过程。 - 构造器操作:可以获取私有构造器并创建对象。 - Method操作:...

    IBM WebSphere eXtreme Scale Version 7.1 ---Programming Guide

    #### 小结 IBM WebSphere eXtreme Scale 版本 7.1 的编程指南为开发者提供了丰富的信息和指导,帮助他们充分利用内存数据库的优势来构建高性能的应用程序。通过理解和掌握上述知识点,开发者将能够更加熟练地使用 ...

Global site tag (gtag.js) - Google Analytics