博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Class Loader解析
阅读量:5308 次
发布时间:2019-06-14

本文共 956 字,大约阅读时间需要 3 分钟。

jvm classLoader architecture:

  1. Bootstrap ClassLoader/启动类加载器 
    主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作。
  2. Extension ClassLoader/扩展类加载器 
    主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。
  3. System ClassLoader/系统类加载器 
    主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。
  4. User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类) 
    在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。

类加载器特性:

  1. 每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。
  2. 为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构。

 

为什么要使用这种双亲委托模式呢?

  1. 因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
  2. 考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这 样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的 ClassLoader。

java动态载入class的两种方式:

  1. implicit隐式,即利用实例化才载入的特性来动态载入class
  2. explicit显式方式,又分两种方式:
    1. java.lang.Class的forName()方法
    2. java.lang.ClassLoader的loadClass()方法

 

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/03/28/2987598.html

你可能感兴趣的文章
day 21 - 1 包,异常处理
查看>>
机器学习等知识--- map/reduce, python 读json数据。。。
查看>>
字符串编码
查看>>
预编译语句(Prepared Statements)介绍,以MySQL为例
查看>>
内联汇编实现 memcpy 和 memset
查看>>
css学习笔记
查看>>
关键字--union
查看>>
iOS开发者账号详细介绍
查看>>
Shell入门
查看>>
运算符与格式输出输入4
查看>>
理解事务——原子性、一致性、隔离性和持久性
查看>>
JAVA 大作业——DAY 7
查看>>
深入学习微框架Spring-boot
查看>>
React 同构
查看>>
输入转移
查看>>
.net 获取网站根目录总结
查看>>
bzoj 2039 [2009国家集训队]employ人员雇佣 最小割建图
查看>>
SQL PRIMARY KEY 约束
查看>>
DS28E01典型应用及破解方法
查看>>
ijkplayer实现IMediaDataSource
查看>>