java classloader
一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:
- Bootstrap ClassLoader 负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
- Extension ClassLoader 负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
- App ClassLoader 负责加载当前java应用的classpath中的所有类。
所以,当我们自定义的classlo ader加载成功了 com.company.MyClass以后,MyClass里所有依赖的class都由这个classLoader来加载完成。
1. 什么是类加载器?
把类加载的过程放到Java虚拟机外部去实现,让应用程序决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。
2. 有哪些类加载器,分别加载哪些类
类加载器按照层次,从顶层到底层,分为以下三种: (1)启动类加载器 : 它用来加载 Java 的核心库,比如String、System这些类 (2)扩展类加载器 : 它用来加载 Java 的扩展库。
(3) 应用程序类加载器 : 负责加载用户类路径上所指定的类库,一般来说,Java 应用的类都是由它来完成加载的。
3. 双亲委派模型
我们应用程序都是由以上三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。
4. 双亲委托模型的工作原理
是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载 都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。
5. 使用双亲委派模型好处?(原因)
第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。
第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。
相关文章
- Java解析XML文件
- 推荐一个Java的HTTP框架 – Forest
- java开发常用四大框架_大牛经验!常用的5款Java框架汇总[通俗易懂]
- 安卓报错:java.lang.RuntimeException: Unable to start activity ComponentInfo—getSupportActionBar()为null
- 【说站】java自定义注解是什么?
- 【说站】java如何自定义函数式接口
- java静态代理实现_静态注册和动态注册的优缺点
- java在线播放_Java实现视频在线播放flv视频
- java webservice接口开发教程_JAVA入门教程
- 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
- 标准化原生 Java:拉进 GraalVM 和 OpenJDK 的距离
- Java 对Oracle Clob(大字符串)格式的操作增改查详解数据库
- Java实现网页截屏详解编程语言
- Java实现zip解压缩目录中的所有文件详解编程语言
- 分布式Java实现Redis分布式:从入门到精通(java实现redis)
- 处理Redis中Java操作自动处理过期数据(redisjava过期)
- 利用Redis与Java实现过期控制(redisjava过期)
- 构建Java应用程序中Redis集群的方法(java连redis集群)
- Linux下快速安装Java开发环境(linux安装java)
- MySQL之Java实现主从复制(java mysql主从)
- Linux下运行Java:一步步踏上学习之路(linux下运行java)
- 跑MySQL和Java 长跑:不停持续前行(mysqljava长)
- Java锁表与Oracle数据库协调实现数据安全(java锁表oracle)
- 数据库Java编程修改Oracle数据库的实践(java修改oracle)
- Java实现Redis队列锁功能(redis队列锁java)
- java无锁hashmap原理与实现详解