关于Java类加载机制的几个基本概念:

  • JDK提供的基本类加载器:引导类加载器(Bootstrap Class Loader)-用于加载JDK中的核心类、扩展类加载器(Ext Class Loader)-用于加载JRE扩展库目录中的类、系统(应用)类加载器(System/App Class Loader)-用于从启动参数-classpath或环境变量CLASSPATH中加载类;
  • 类加载器的树状结构:在JVM中,所有类加载器实例按树状结构组织,根结点为引导类加载器。除根结点外的所有类加载器都有一个非空的父类加载器,从而构成树状结构;
  • 双亲委托(代理)模型:当类加载器收到加载类或资源的请求时,通常都是先委托给父类加载器加载,也就是说只有当父类加载器找不到指定类或资源时,自身才会执行实际的类加载过程;
  • 类的判等:即使类完全相同(名称相同、字节码相同),不同类加载器实例加载的类对象也是不相等的;这一条规则是Java类加载机制中非常核心且重要的规则,它保证了类加载机制实现“类隔离”、“保护JDK中的基础类”等目标得以实现;
  • 线程上下文类加载器机制:在Java中我们和类加载机制打交道的最简单的方法是通过Class.forName方法来加载类,该方法默认情况下是以调用者的类加载器来加载指定的类。这在大多数情况下都足够了,少数情况下我们可以使用和线程关联的类加载器来加载类(即线程上下文类加载器)。线程上下文类加载器通常在实现JDK的SPI或编写框架程序时使用;
  • 类的垃圾回收:只有当类加载器可被作为垃圾回收的前提下,其加载的类才有可能被回收;

Java的类加载机制涉及的概念并不多,但是要真正理解,可能还需要花一些功夫。下面以问答的形式谈谈我对Java类加载机制的理解:

  • Q:JDK为什么要提供三个类基本类加载器?
  • A:由于类加载器本身也是一个类,它也需要加载,这就是引导类加载器必须存在的理由之一;系统类加载器是最常使用的类加载器,用于处理java命令行参数-classpath或环境变更CLASSPATH,有了系统类加载器,大多数Java应用就不需要编写自己的类加载器了;扩展类加载器呢?几乎感觉不到它的存在和作用;
  • Q:JDK如何保证类加载器之间形成树状结构?
  • A:所有类加载器必须从ClassLoader类派生,该类的构造器保证了所有类加载器一定存在一个父类加载器,这就保证了树状结构的形成。不过,父类加载器其实是可以为null的,Java的类加载机制中将null视为引导类加载器;
  • Q:双亲委托模型是必须的吗?
  • A:双亲委托模型只能算是JDK的“最佳实践”,自己编写类加载器时,完全可以不遵循双亲委托模型。类似Tomcat这样的WEB容器就实现了与双亲委托模型相反的机制,即加载类时总是先在自身中加载,加载不到时再到父加载器中加载;
  • Q:是否可以通过类加载机制实现应用重写JDK中的类?
  • A:不可以!自定义的类加载器主要功能是实现字节码的加载,将字节码转换为Class对象的方法是在ClassLoader类中定义的。ClassLoader方法在从字节码构建Class对象的方法中控制了要加载的类名不能以"java."开头;即所有java包及其子包中的类都不允许通过类加载机制重载;
  • Q:编写框架程序和普通程序在动态类加载方面有没有什么不同?
  • A:普通程序通常不需要考虑类加载机制,如果需要动态加载类,一般使用最简单的Class.forName(String)方法就够了;但编写框架程序时,往往不能这么简单地处理,原因是你不清楚要动态加载的类是否能被加载框架类的类加载器所加载,这时通常可以使用线程上下文类加载器动态加载类;

参考资料:

Java类加载机制总结的更多相关文章

  1. Java 类加载机制

    类的加载: 类的初始化: 类什么时候才被初始化:1)创建类的实例,也就是new一个对象2)访问某个类或接口的静态变量,或者对该静态变量赋值3)调用类的静态方法4)反射(Class.forName(&q ...

  2. Java类加载机制深度分析

    转自:http://my.oschina.net/xianggao/blog/70826 参考:http://www.ibm.com/developerworks/cn/java/j-lo-class ...

  3. 理解Java类加载机制(译文)

    理解java类加载机制 你想写类加载器?或者你遇到了ClassCastException异常,或者你遇到了奇怪的LinkageError状态约束异常.应该仔细看看java类的加载处理了. 什么是类加载 ...

  4. 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制

    剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...

  5. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  6. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  7. Java类加载机制及自定义加载器

    转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...

  8. Java类加载机制的理解

    算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解.要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机 ...

  9. Java类加载机制与Tomcat类加载器架构

    Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...

  10. 带你解析Java类加载机制

      目录 Java类加载机制的七个阶段 加载 验证 准备(重点) 解析 初始化(重点) 使用 卸载 实战分析 方法论 树义有话说 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如 ...

随机推荐

  1. codevs3410 别墅房间

    题目描述 Description 小浣熊松松到他的朋友家别墅去玩,发现他朋友的家非常大,而且布局很奇怪.具体来说,朋友家的别墅可以被看做一个N*M的矩形,有墙壁的地方被标记为’#’,其他地方被标记为’ ...

  2. MyBatis3错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决

    在使用Maven新建QuitStart类型项目时,引入了MyBatis3.2.0版本的JAR包之后,出现如下错误: Exception in thread "main" java. ...

  3. 可恢复的安全rm

    我们常常使用rm去删除一些文件.假设不小手一抖,那么就悲剧了.你们都懂的... 在经历过一次这种慘剧后.决定永远杜绝这种情况.重写写了shell函数.运行安全的rm.这个函数会把要删除的文件按日期备份 ...

  4. ACdream区域赛指导赛之手速赛系列(7)

    A -Dragon Maze Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...

  5. vim随想笔记(1)

    本人是一个vim的狂热粉丝,越是使用vim,越是认为琐碎内容太多,时不时地出现一些自己没有见过的使用方法.命令. 因此准备在博客上用空余时间在阅读<学习vi和vim编辑器>的基础上总结一下 ...

  6. U4699 鸡蛋

    U4699 鸡蛋 0通过 37提交 题目提供者飞翔 标签 难度尚无评定 提交 最新讨论 暂时没有讨论 题目背景 调皮的kkk准备恶搞他的同学兼朋友——你! 题目描述 kkk准备从楼上扔鸡蛋下来砸在lz ...

  7. 把TXT GB2312文件转换成TXT UTF8文件

    /// <summary>        /// 把TXT GB2312文件转换成TXT UTF8文件        /// </summary>        /// < ...

  8. 插入排序(1)——直接插入排序(insert sort)

    假设有一组无序序列 R0, R1, ... , RN-1. (1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列. (2) 然后,我们要依次把 R1, R2, ... , RN- ...

  9. java动态代理实例

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflec ...

  10. 【转】pycharm常用快捷键

    转自:http://www.2cto.com/os/201410/341542.html 转来珍藏着,以后慢慢完善. 编辑类: Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + ...