关于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. Wow! Such Sequence! (线段树) hdu4893

    http://acm.hdu.edu.cn/showproblem.php?pid=4893 先贴上一份还没过的代码,不知道拿出错了  1 // by caonima ; ; ],col[MAX< ...

  2. 算(tyvjP4700)

    背景 zhx和他的妹子出去玩. 描述

  3. CF671C. Ultimate Weirdness of an Array

    n<=200000个<=200000的数问所有的f(i,j)的和,表示去掉区间i到j后的剩余的数字中任选两个数的最大gcd. 数论日常不会.. 先试着计算一个数组:Hi表示f(l,r)&l ...

  4. multiple instance of mac app

    一般情况下,mac系统上的应用程序只能启动一个实例,现在做项目,需要mac上同时启动多个实例,如何做呢,下面就说明完成这个功能的方法: 主要原理:利用 open -n Applications/XXX ...

  5. memory management in oracle 11G R2

    When we talking about memory management in Oracle, we are refering to SGA and PGA. The management me ...

  6. 深度优先遍历DFS

    深度优先遍历,这个跟树中的遍历类似,做深度遍历就是访问一个节点之后,在访问这个节点的子节点,依次下去是一个递归的过程. 具体代码: void DFS(MGraph g ,int i) {     in ...

  7. 类似于SVN的文档内容差异对比工具winmerge

    原文:http://www.jianshu.com/p/99282a4f3870 https://sourceforge.net/projects/winmerge/?source=typ_redir ...

  8. [Vue @Component] Dynamic Vue.js Components with the component element

    You can dynamically switch between components in a template by using the reserved <component>  ...

  9. Unity3D 怎样在安卓手机上播放视频

    曾经仅仅会在电脑上通过Unity3D播放视频,研究了下发现通过Unity3D在手机上播放视频也很easy.现介绍例如以下. void OnGUI()     {         if (GUI.But ...

  10. 数据库数据在Java占用内存简单估算

    数据库数据在Java占用内存简单估算 结论: 1.数据库记录放在JAVA里,用对象(ORM一般的处理方式)须要4倍左右的内存空间.用HashMap这样的KV保存须要10倍空间; 2.假设你主要数据是t ...