您的位置:首页 > 编程语言 > Java开发

Java类加载机制

2017-08-13 22:20 330 查看
1. 类的加载过程:
加载:查找并加载类的二进制数据,将类的class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象
用来封装类在方法区内的数据结构

连接
- 验证:确保被加载的类的正确性
- 准备:为类的静态变量分配内存,并将其初始化为默认值
- 解析:把类的符号引号转换为直接引用

初始化:为类的静态变量赋予正确的初始值

使用:

卸载:

所有的Java虚拟机实现必须在每个类或接口被Java程序“首次主动使用”

时才初始化他们

2. Java程序对类的使用方式

2.1 主动使用(6种)
创建类的实例
访问某个类或接口的静态变量,或者对该静态变量赋值
调用类的静态方法
反射
初始化一个类的子类
Java虚拟机启动时被标明为启动类的类

2.2 被动使用
除了主动使用,其他都是被动使用

3.类加载器类型
3.1 Java虚拟机自带的加载器
3.1.1 根类加载器(Bootstrap):没有父加载器。负者加载虚拟机的核心类库,如java.lang.*等。根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。根类加载器的实现依赖于底层操作系统,属于虚拟机的实现一部分,它并没有继承java.lang.ClassLoader类。

3.1.2 扩展类加载器(Extension、ExtClassLoader):父加载器为根类加载器,它从java.ext.dirs系统属性所指定的目录中
加载类库,或者从jdk的安装目录的jre\lib\ext子目录(扩展目录)下加载类库,如果用户创建的jar文件放在这个目录下,也会自动由扩展类加载器加载。扩展类加载器是纯Java类,是java.lang.ClassLoader类的子类。

3.1.3 系统类加载器(应用类加载器AppClassLoader)(System) 它的父加载器为扩展类加载器,它是用户自定义的类加载器的默认父加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类。系统类加载器是纯Java类,是java.lang.ClassLoader类的子类。

3.2 用户自定义加载器
3.2.1 java.lang.ClassLoader的子类
3.2.2 用户可以定制类的加载方式

类加载器的父亲委托机制
在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器以外,

其余的类加载器都有且只有一个父加载器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: