类加载过程
类加载过程有:加载、连接(验证、准备、解析)、初始化、使用、卸载
- 加载:将class文件加载到方法区,然后在堆中生成对应的class对象
- 验证:对class静态结构进行验证,包括元数据、字节码进行验证,确保class是安全的
- 准备:对class中的静态属性赋默认值
- 解析:将符号引用解析成直接引用(静态解析,多态的动态解析是发生在初始化之后运行阶段)
-
初始化:主动资源初始化,对class中的成员变量、静态变量、静态代码块初始化
类加载器
类加载器有:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器
- 启动类加载器:加载核心类库的类,/jre/lib目录下的jar包
- 扩展类加载器:加载扩展库目录的类,/jre/lib/ext目录下的jar包
- 应用程序类加载器:当前java应用classpath中的类
- 自定义类加载器:继承ClassLoader,打破双亲委派,需要实现loadClass方法;否则实现findClass方法
双亲委派机制
类的加载满足双亲委派机制,每个类加载器收到类加载请求时,会先委派给父类加载器进行加载,当父类加载器无法加载类时,自己才会尝试去加载。
双亲委派模型的好处有:防止核心库被篡改;避免类的重复加载。