类加载器:负责将 .class 文件(存储的物理文件)加载在到内存中。
类进行加载的时机有如下场景:
根据程序员通过程序制定的主观计划,去初始化类变量和其他资源(即静态变量赋值,及初始化其他资源)。
分类:
Bootstrap class loader
:虚拟机的内置类加载器,通常表示为 null,并且没有父类。Platform class loader
:平台类加载器,负责加载 JDK 中一些特殊的模块。System class loader
:系统类加载器,负责加载用户类路径上所指定的类库。类加载器的继承关系:
示例:
public class ClassLoaderDemo { public static void main(String[] args) { // 获取系统类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); // 获取系统类加载器的父加载器 -- 平台类加载器 ClassLoader classLoader1 = systemClassLoader.getParent(); // 获取平台类加载器的父加载器 -- 启动类加载器 ClassLoader classLoader2 = classLoader1.getParent(); System.out.println("系统类加载器" + systemClassLoader); System.out.println("平台类加载器" + classLoader1); System.out.println("启动类加载器" + classLoader2); } }
双亲委派模式如下:
方法名 | 说明 |
---|---|
public static ClassLoader getSystemClassLoader() | 获取系统类加载器 |
public InputStream getResourceAsStream(String name) | 加载某一个资源文件 |
示例:
public class ClassLoaderDemo { public static void main(String[] args) throws IOException { // static ClassLoader getSystemClassLoader():获取系统类加载器 // InputStream getResourceAsStream(String name):加载某一个资源文件 // 获取系统类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); // 利用加载器去加载一个指定的文件 // 参数:文件的路径(放在src的根目录下,默认去那里加载) // 返回值:字节流 InputStream is = systemClassLoader.getResourceAsStream("prop.properties"); Properties prop = new Properties(); prop.load(is); System.out.println(prop); is.close(); } }