关于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. [国家集训队2010]小Z的袜子

    ★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜 ...

  2. MS SQL SERVER 书BOOK

    http://www.cnblogs.com/lyhabc/p/4833248.html

  3. 不折移动web不腾--开启我的个人Mac之旅

    背景,非常久非常久曾经(听过)Linux,瞎玩 Mac mini,而今Linux下开发技能半身不遂,处于放任状态.明明就知道随着时间流逝会越陌生的东西越不想去抓住最后的余温,不知道这算不算放弃,反正迟 ...

  4. BC #62 div1 02

    /* 数位DP题,设dp[n][k][j]为前n位最后一位是k时mod为j的个数.操作都相同,可以使用矩阵加速.本来对于每一位是7*10,可以把它压向一个向量. 加速矩阵为70*70,再加一维计算前缀 ...

  5. [Vue @Component] Define Props on a Vue Class with vue-property-decorator

    While traditional Vue components require a data function which returns an object and a method object ...

  6. Solid Edge如何制作装配体的剖视图

    在装配体中,点击检视-剖面   选择剖切方向(向内是指把矩形框之内的东西去掉不要,向外是指把矩形框之外的东西去掉不要),选择剖切深度   最后效果如下图所示   你也可以选择不剖切的零件,效果如下图所 ...

  7. android自己定义之 5.0 风格progressBar

    近期做项目,用到了ProgressBar .就想到了要使用Android5.0 的效果,就随手实现了一下. 效果图: 大概的思路: 1. 圆圈通过Canvas去绘制 2.圆圈的动画通过Animator ...

  8. 运行Java -jar somefile.jar时发生了什么(二)

    (6)Java.c中的LoadMainClass 位置jdk/src/share/bin/java.c 该方法负责载入main函数所在的类. 该方法首先载入sun.launcher.LauncherH ...

  9. SoapUI在Jenkins中的配置

    Jenkins Label: windows_ws_test   已有Jenkins环境变量 %READYAPI_PRO_HOME%  - <D:\Program Files\SmartBear ...

  10. ios3--UIView的常见方法

    // // ViewController.m // 07-UIView的常见方法 // #import "ViewController.h" @interface ViewCont ...