1.什么是类加载器
<1>概念:类加载器是用来加载类的工具(从硬盘加载到JVM内存)
<2>类加载器的加载时机【类在使用时才被加载,不使用不加载】
a.创建类的对象时
b.通过类名调用静态方法时
c.通过反射加载类
<3>3.类加载器的分类
a.启动类加载器:Bootstrap ClassLoaders,负责加载JAVA_HOME\lib目录下的jar和class文件
b.平台类加载器:Platform ClassLoader
c.系统类加载:System ClassLoader
d.自定义类加载器
【双亲委派模型 a>b>c>d,逻辑上的继承关系,最下层传递任务给最上层,上层范围之外的则会依次返回下层】
2.获取类加载器
//获取类加载器
public class Demo1 {
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);
}
}
打印结果:
--------------------------------------------------------------------------------------------------
系统类加载器jdk.internal.loader.ClassLoaders$AppClassLoader@3fee733d
平台类加载器jdk.internal.loader.ClassLoaders$PlatformClassLoader@3941a79c
启动类加载器null
3.类加载器应用
//使用类加载器src目录下的配置文件 config.properties
//不局限于电脑路径
public class Demo1 {
public static void main(String[] args) throws IOException {
//static classLoader getSystemClassLoader()获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//InputStream getResourceAsStream(String name)加载某一个资源文件[src目录下]
//利用加载器去加载一个指定的文件[不在src下在报null exception]
//参数:文件的路径
//返回值:字节流
//自动封装返回一个字节流
InputStream is = systemClassLoader.getResourceAsStream("config.properties");
//创建Properties集合【配置文件只能为英文】
Properties properties = new Properties();
properties.load(is);
System.out.println(properties);
}
}