类加载器:负责将.class文件(存储的物理文件)加载在到内存中
类加载时机:
1创建类的实例(对象)
2调用类的类方法 //也就是静态类
3访问类或者接口的类变量,或者为该类变量赋值 //也就是静态变量
4使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
5初始化某个类的子类
6直接使用java.exe命令来运行某个主类
用到就加载,不用不加载
类加载过程
类加载器的分类
启动类加载器(Bootstrap ClassLoader):虚拟机内置的类加载器。
平台类加载器(Platform Classloader):负责加载JDK中一些特殊的模块。
系统类加载器(System Classloader):负责加载用户类路径上所指定的类库。 //平常我们用的最多的就是这个
双亲委派模型
下面是上面的子类 。
还有个自定义类加载器,不怎么使用所以暂时忽略
打印各个加载器:
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@78308db1
平台类加载器jdk.internal.loader.ClassLoaders$PlatformClassLoader@27d6c5e0
启动类加载器null
类加载器方法
public static ClassLoader getSystemClassLoader() | 获取系统类加载器 |
public InputStream getResourceAsStream(String name) | 加载某一个资源文件 |
public InputStream getResourceAsStream(String name) ;
利用加载器加载指定的文件,参数是文件的路径 返回值为输入字节流