一、类加载器是做什么的
1、将Class文件加载到JVM。
2、根据父级优先原则,决定一个类由谁加载。
3、将Class文件解析成JVM认识的结构。
二、类加载器的种类
1、BootstrapClassLoader,顶级类加载器,加载JVM自身需要的类。
2、ExtClassLoader,他负责加载扩展类,如jre/lib/ext或java.ext.dirs目录下的类。
3、AppClassLoader,他负责加载应用类,所有classpath目录下的类都可以被这个类加载器加载。
4、自定义类加载器,如果你要实现自己的类加载器,他的父类加载器都是AppClassLoader。
三、类加载器的继承实现关系
1、BootstrapClassLoader完全是由JVM控制,并不是父也没有子。
2、ExtClassLoader和AppClassLoader是Launcher的内部类。
3、ExtClassLoader和AppClassLoader继承了URLClassLoader。
4、URLClassLoader实现了抽象类ClassLoader。
四、隐式加载和显示加载
1、隐式加载:JVM自动加载类而不是手动编写ClassLoader代码去加载。
2、显式加载:手工编写代码加载类,例如this.getClass.getClassLoader().loadClass()
五、类加载器的三个机制
1、双亲委派:一个类加载器收到加载类的请求首先会找到自己的上一级类去加载,AppClassLoader->ExtClassLoader->BootstrapClassLoader的顺序,谁找到了负责的类谁就去加载。
2、可见性:父类加载器看不到子类加载的内容,子类加载器看得到父类加载的内容。
3、单一性:一个类只会被一个加载器加载一次。
六、加载Class文件的三个阶段
1、找到Class文件并加载字节码到内存。
2、验证字节码、分析Class类数据结构准备相应的内存分配、解析类进行符号表的链接。
3、类中静态属性和初始化赋值,执行静态块语句