为什么ClassLoader的缓存按递增顺序检查,而类加载以降序排列?
Java中的ClassLoader基于三个原则:委托,可见性和唯一性.如果父级无法查找或加载类,则委托原则将类加载的请求转发到父类加载器并仅加载该类.可见性原则允许子类加载器查看父类ClassLoader加载的所有类,但父类加载器无法查看子加载的类.唯一性原则允许只加载一次类,这基本上是通过委托实现的,并确保子类ClassLoader不会重新加载已由父加载的类.
换句话说描述在这里:
Java中的类加载器是在树中组织的.根据请求,类加载器确定该类是否已在过去加载,在其自己的缓存中查找.如果该类存在于高速缓存中,则CL返回该类,否则,它将该请求委托给父类.如果未设置父级(是Null)或无法加载类并抛出ClassNotFoundException,则类加载器会尝试加载类本身并在其自己的路径中搜索类文件.如果可以加载该类,则返回该类,否则抛出ClassNotFoundException.缓存查找从子节点到父节点递归地进行,直到到达树根或在缓存中找到类. 如果到达了根,则类加载器尝试加载该类并展开从父级到子级的递归.总结我们有以下顺序:
高速缓存
亲
自
这种机制确保类最容易被最靠近根的类加载器加载.