类加载器:
JVM定义把类加载阶段中的“通过类的全名称获取此类的二进制流”这种操作实现的模块叫做类加载器。
BootStrap(启动类加载器):使用C++实现,是将JVM自身的一部分;启动加载器负责加载存放于<Java_HOME>\lib目录中能被JVM识别;启动类加载器无法被java直接引用。
ExtClassLoader(扩展类加载器):他负责加载<Java_HOME>\lib\ext目录中或者java.ext.dirs系统变量指定的类库,开发者可直接使用扩展类开发器。
AppClassLoader(应用程序类加载器):负责加载用户路径(ClassPath)指定的类库,如果应用程序没有自定义类加载器,则默认使用此加载器。
自定义类加载器:必须继承ClassLoader。
双亲委派模型:
类加载器的层次关系,称为类加载器的双亲委派模型。除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。
工作流程:如果一个类加载器收到了类加载的请求,他不会直接加载此类,而是先把这个请求委托给父类,每一个层次的类加载器都是如此,因此加载请求都会先传到顶层的BootStrap加载器中,只有父类加载器反馈无法完成这个加载请求时,子加载器才会尝试去加载。
优点:保证java程序的稳定运行,基础类库不会被其他自定义的同名类的影响,无论哪个加载器要加载Object类,最终都是委派给启动类加载器加载,Objec类在程序的各种类加载器环境都是同一个类。
比较两个类是否相等前提,必须是由同一个类加载器加载。