java 类加载器_Java 类加载器
一、概述
类加载器通过一个类的全限定名来获取描述此类的二进制字节流。
类加载器在类层次划分、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()。
二、双亲委派模型
如图所示类加载器之间的层次关系,就称为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用组合关系来复用父加载器的代码。
![](/assets/blank.gif)
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此。
双亲委派模型对于保证 Java 程序的稳定运作很重要,它让 Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。
双亲委派模型不是一个强制性的约束模型,而是 Java 设计者们推荐给开发者们的一种类加载器的实现方式。
java 类加载器_Java 类加载器相关推荐
- java引导类加载器_Java类加载器层次结构(一)
类加载器有一种父/子关系.除了引导类加载器外,每个类加载器都有一个父类加载器.本章通过分析ClassLoader的源码来展示java类加载器的层次结构. 根据规定,类加载器会为它的父类加载器提供一个机 ...
- java 调试 工具_Java调试器–权威的工具列表
java 调试 工具 Java调试是一个复杂的空间. 调试器的类型很多,工具也很多. 在此页面中,我们将介绍7种类型的调试器之间的区别,并查看每个类别中的主要工具,以帮助您为正确的工作选择正确的工具. ...
- java 装饰器_JAVA装饰器模式
Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...
- java的安全管理器_Java安全管理器——SecurityManager
总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...
- java类加载器_JAVA类加载器
虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器: 1. 启动类加载器(Bootstrap ClassLoader) 负责加载 JA ...
- 类java的步骤_java类加载的过程
类加载就是三个过程:加载.链接.初始化 链接又可以分为验证.准备.解析 1.加载 将class字节码文件通过类加载器装入内存中 2.验证 确保当前class文件的字节流所包含的内容符合当前JVM的规范 ...
- java getinstance 反射_JAVA类加载和反射介绍
简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息. 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性, ...
- java file 初始化_java类加载和对象初始化
对象初始化过程: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 3.其次,初始化父 ...
- java 媒体播放器_Java多媒体播放器(三)
No.3 vlcj 一.简介 The vlcj project first gives you Java bindings to just about all of the native functi ...
最新文章
- layui中从上一个js模块中取参数_layui的引用js踩坑
- Ubuntu9.10使用windows的字体的方法!
- 2017/12/14 懒冬 时间序列基础
- nginx负载均衡的五种方式
- 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-线性回归tf.keras概述-02
- 数据库SQL语言从入门到精通--Part 2--MySQL安装
- 【学习笔记】线性规划与对偶问题和LP对偶费用流([ZJOI2013]防守战线题解)
- [Bugku][Crypto][CTF][2020]Crypto 1-20 write up
- 关于ORA-01187: cannot read from file because it failed verification tests 的处理方法
- Rails用DELETE method提交表单讲解
- 【抛砖引玉】“技术顾问” —— 老程序员的一个出路。
- jquery 选择器 逗号
- 苹果Mac版 PhotoShop 2021 自动上色功能?
- python线性拟合、不确定性
- fastdfs原理及过程
- word导出手机端乱码或者打不开解决办法
- stm32F407 + FreeRTOS + FAT 文件系统移植
- oracle之Number类型小数转字符串丢精度
- Java 序列化对象为json字符串,属性首字母大写,并按照属性首字母排序
- 在xampp中访问html,怎么控制远程访问xampp
热门文章
- 【BZOJ1406】【codevs2478】密码箱,数论练习
- If 的替代词汇:unless、in case..._60
- 2017.8.11 OSU 失败总结
- linux的进程/线程/协程系列1:进程到协程的演化
- python requests库api_python利用requests库进行接口测试的方法详解
- android os 偷跑,不测不知道,原来我们的流量每天都在被“偷”走!
- iphone微信电话不弹出_iPhone快速分享电话号码的方法!
- java 8 biconsumcr_java8新特性
- 数据库两大神器【索引和锁】
- [转]python3之模块psutil系统性能信息