将
class
文件加载到内存中
类加载时机
用到就加载,不用不加载
执行到这个代码后,用到了这个类才会加载,第一次用到时加载
- 创建类的实例(对象)
- 调用类的类方法
- 访问类或者接口的类变量,或者为该类变量赋值
- 使用反射方式来强制创建某个类或接口对应的
java.lang.Class
对象 - 初始化某个类的子类
- 直接使用
java.exe
来运行某个主类
类加载过程
- 加载: 通过
包名 + 类名(全限定名)
获取这个类准备用流进行传输,将这个类加载到内存中,加载完毕创建一个Class
对象 - 链接
- 验证: 判断文件中的信息是否符合
Java
虚拟机规范,看是否会造成隐患 - 准备: 初始化静态变量
- 解析: 将类的文件中的二进制引用转换为符号引用(本类中如果用到了其他类,此时就需要找到对应的类)
- 验证: 判断文件中的信息是否符合
- 初始化
类加载器分类
- 启动类加载器: 虚拟机内置的类加载器,例:
String List
- 平台类加载器: 负责加载
JDK
中一些特殊的模块,例:java.sql.Date
- 系统类加载器: 负责加载用户类路径上所指定的类库,例: 我们自己写的
双亲委派模型
自定义类加载器 -> 系统类加载器 -> 平台类加载器 -> 启动类加载器
常用方法
- 获取系统类加载器:
getSystemClassLoader()
- 加载某一个类资源:
getResourceAsStream() // 文件必须在src目录下
例:
Properties prop = new Properties();
InputStream is = ClassLoader.getSystemClassLoader()
.getResourceAsStream("prop.properties");
prop.load(is);
System.out.println(prop);
is.close();