java的类加载器是一个运行时的核心基础设施代码块
主要分为Load,Link,Init
第一步,Load阶段读取类文件产生二进制流,并转化为特定的数据结构,初步的校验cafe babe魔法数、常量池、文件长度、
是否有父类等,然后创建对应的类的java.lang.Class实例
第二步,Link阶段包括验证、准备、解析三个步骤。验证是更详细的校验,比如final是否合规、类型是否正确等;准备阶段是为静态变量分配内存,并设置默认值,解析类和方法确保类与类之间的相互引用的正确性完成内存结构布局
第三步 Init阶段执行类构造器<clinit>方法,如果赋值运算时通过其他类静态方法来完成的,那么会马上解析另外一个类,
Bootstrap ClassLoader --------> jre/lib/rt.jar
Platform ClassLoader -------> jre/lib/ext/*.jar
Application ClassLoader ------> CLASSPATH
当加载一个类时首先询问CLASSPATH 是否已经加载了 否 在询问Platform是否加载 否 再询问时候加载BootStrap
然后向下尝试加载,都加载不了通知当前类加载器准予加载
通过代码查看BootStrap已加载的类库
自定义类加载器
(1)隔离加载类
在某些框架内进行某些中间件与应用的模块隔离,把类加载到不同的环境。
(2)修改类的加载方式 类的加载模型并非强制的,除了BootStrap外其他加载并非一定得引入,可以根据按照需要进行动态引入
(3)扩展加载源 比如数据库、网络、甚至是电视机顶盒进行加载
(4)防止源码泄露。java代码容易被编译和篡改,进行代码的编译加密。那么类加载器也需要自定义,还原加密字节码
实现自定义类加载器的步骤:继承ClassLoader,重写findClass()方法,调用defineClass()方法。