Java类加载以及双亲委派机制
刚刚接触到这两个概念,这里就简单的阐述一下。
类加载器作用就是用一个类的全限定名获得他的二进制字节流,这个动作实在jvm外部实现的,实现该功能的代码模块就是类加载器。
举个简单的例子:比如我们要用电脑光驱看一个光碟的内容,光碟就是我们的类,光驱就是类加载器,我们想要看光碟的内容就需要用光驱来加载光碟,通过光驱的解析,我们才能看到里面的内容。
类加载分为5的步骤:加载->验证->准备->解析->初始化
加载阶段:
1、用全限定名获取类的二进制字节流
2、将字节流的静态存储结构转变为方法区的运行时数据结构
3、在内存中生成一个java.lang.class对象,作为该类的外部访问接口
验证阶段:
1、文件验证:主要目的是保证输入的字节流能正确的被解析并且存储在方法区内
2、元数据验证:保证字节流描述的信息都符合Java规范(语义验证)
3、字节码验证:保证任意时刻对于操作数的数据类型都能匹配
4、符号引用验证:确认能找到对应类以及内部方法变量等
准备阶段:
为类变量分配内存以及初始化类变量
解析阶段:
将常量池中的符号引用替换为直接引用
初始化阶段:
将代码中指定的值去初始化变量或其他资源
类加载器分为:启动类加载器、扩展类加载器、应用程序类加载器
他们成树形结构。
双亲委派机制:简单来说就是当一个类发起加载请求时,他的加载器不会立即自己去尝试加载他,而是给他的上级先去尝试加载(每一层都这样),如果他的上级回应加载不了,那他才自己尝试加载。如果他的上机加载器是null,那就用启动类加载器进行尝试加载。
双亲委派机制保证了基础类的正常正确加载以及高效的运行,解决了基础类的统一性问题。