一、概述

类加载器通过一个类的全限定名来获取描述此类的二进制字节流。

类加载器在类层次划分、OSGi、热部署、代码加密等领域发挥着重要的作用。

比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提之下才有意义,否则,即使这两个类是来源于同一个 Class 文件,只要加载它们的类加载器不同,那这两个类就必定不相等。这里的“相等”包括 equal() 方法、isAssignableForm() 方法、isInstance() 方法和 instanceof 关键字。

下面的例子可以看到,虽然都是来自同一个 Class 文件,但是因为类加载器不同,依然是两个独立的类,自然不会“相等”。

public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {    // 自定义简单类加载器    ClassLoader myClassLoader = new ClassLoader() {        @Override        public Class> loadClass(String name) throws ClassNotFoundException {            try {                String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";                InputStream inputStream = getClass().getResourceAsStream(fileName);                if (inputStream == null) {                    return super.loadClass(name);                }                byte[] bytes = new byte[inputStream.available()];                inputStream.read(bytes);                return defineClass(name, bytes, 0, bytes.length);            } catch (IOException e) {                e.printStackTrace();            }            return super.loadClass(name);        }    };    Object newInstance = myClassLoader.loadClass("org.jvm.demo.chapter7.ClassLoaderTest").newInstance();    System.out.println(newInstance.getClass()); // org.jvm.demo.chapter7.ClassLoaderTest    System.out.println(newInstance instanceof org.jvm.demo.chapter7.ClassLoaderTest); // false}

绝大部分 Java 程序都会使用到以下三种系统提供的类加载器:

  • 启动类加载器(Bootstrap ClassLoader):负责加载 JAVA_HOMElib 或着 -Xbootclasspath 参数指定目录下的类库,加载内容按文件名识别,如 rt.jar,启动类加载器无法被 Java 程序直接引用。
  • 扩展类加载器(Extension ClassLoader):负责加载 JAVA_HOMElibext 或者 java.ext.dirs 系统变量所指定的所有类库,该加载器由 sun.misc.Launcher$ExtClassLoader 实现,开发者可以直接使用扩展类加载器 — Launcher.getLauncher().getClassLoader()。。
  • 应用程序类加载器(Application ClassLoader):负责加载用户类路径 ClassPath 上所指定的类库,如果应用程序没有自定义过自己的类加载器,一般情况下就是程序的默认类加载器,该加载器由 sun.misc.Launcher$AppClassLoader 实现,开发者可以直接使用这个类加载器 — ClassLoader.getSystemClassLoader()。

二、双亲委派模型

如图所示类加载器之间的层次关系,就称为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用组合关系来复用父加载器的代码。

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此。

双亲委派模型对于保证 Java 程序的稳定运作很重要,它让 Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。

双亲委派模型不是一个强制性的约束模型,而是 Java 设计者们推荐给开发者们的一种类加载器的实现方式。

java 类加载器_Java 类加载器相关推荐

  1. java引导类加载器_Java类加载器层次结构(一)

    类加载器有一种父/子关系.除了引导类加载器外,每个类加载器都有一个父类加载器.本章通过分析ClassLoader的源码来展示java类加载器的层次结构. 根据规定,类加载器会为它的父类加载器提供一个机 ...

  2. java 调试 工具_Java调试器–权威的工具列表

    java 调试 工具 Java调试是一个复杂的空间. 调试器的类型很多,工具也很多. 在此页面中,我们将介绍7种类型的调试器之间的区别,并查看每个类别中的主要工具,以帮助您为正确的工作选择正确的工具. ...

  3. java 装饰器_JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  4. java的安全管理器_Java安全管理器——SecurityManager

    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...

  5. java类加载器_JAVA类加载器

    虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器: 1. 启动类加载器(Bootstrap ClassLoader) 负责加载 JA ...

  6. 类java的步骤_java类加载的过程

    类加载就是三个过程:加载.链接.初始化 链接又可以分为验证.准备.解析 1.加载 将class字节码文件通过类加载器装入内存中 2.验证 确保当前class文件的字节流所包含的内容符合当前JVM的规范 ...

  7. java getinstance 反射_JAVA类加载和反射介绍

    简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息. 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性, ...

  8. java file 初始化_java类加载和对象初始化

    对象初始化过程: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 3.其次,初始化父 ...

  9. java 媒体播放器_Java多媒体播放器(三)

    No.3 vlcj 一.简介 The vlcj project first gives you Java bindings to just about all of the native functi ...

最新文章

  1. layui中从上一个js模块中取参数_layui的引用js踩坑
  2. Ubuntu9.10使用windows的字体的方法!
  3. 2017/12/14 懒冬 时间序列基础
  4. nginx负载均衡的五种方式
  5. 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-线性回归tf.keras概述-02
  6. 数据库SQL语言从入门到精通--Part 2--MySQL安装
  7. 【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)
  8. [Bugku][Crypto][CTF][2020]Crypto 1-20 write up
  9. 关于ORA-01187: cannot read from file because it failed verification tests 的处理方法
  10. Rails用DELETE method提交表单讲解
  11. 【抛砖引玉】“技术顾问” —— 老程序员的一个出路。
  12. jquery 选择器 逗号
  13. 苹果Mac版 PhotoShop 2021 自动上色功能?
  14. python线性拟合、不确定性
  15. fastdfs原理及过程
  16. word导出手机端乱码或者打不开解决办法
  17. stm32F407 + FreeRTOS + FAT 文件系统移植
  18. oracle之Number类型小数转字符串丢精度
  19. Java 序列化对象为json字符串,属性首字母大写,并按照属性首字母排序
  20. 在xampp中访问html,怎么控制远程访问xampp

热门文章

  1. 【BZOJ1406】【codevs2478】密码箱,数论练习
  2. If 的替代词汇:unless、in case..._60
  3. 2017.8.11 OSU 失败总结
  4. linux的进程/线程/协程系列1:进程到协程的演化
  5. python requests库api_python利用requests库进行接口测试的方法详解
  6. android os 偷跑,不测不知道,原来我们的流量每天都在被“偷”走!
  7. iphone微信电话不弹出_iPhone快速分享电话号码的方法!
  8. java 8 biconsumcr_java8新特性
  9. 数据库两大神器【索引和锁】
  10. [转]python3之模块psutil系统性能信息