类加载机制之ClassLoader
基础知识
- JVM如何区分不同类型? JVM通过类全名+加载该类的ClassLoader区分的;
- 同一个ClassLoader能够重复加载同一个类?同一个ClassLoader不允许多次加载一个类的,否则会报java.lang.LinkageError;
- JVM只提供了加载类的方法,但并没有提供卸载的方法(主动回收,可预期),当发生FGC时才被回收(被动回收,不可预期);
ClassLoader类继承关系
注意区别“ClassLoader类继承关系”与“类加载器组织关系”,下图是从Java语法角度说明的ClassLoader相关类之间的继承关系:
ClassLoader重要方法
loadClass(重要):双亲委托机制的体现,先委托父类加载器加载,加载不到再自己加载,如果想自定义类加载机制需要继承ClassLoader,覆盖loadClass方法实现。
findClass:当前类加载器查找类的逻辑,当父类加载器没有加载到指定类时被调用。
ClassLoader.loadClass()过程
- 查看当前ClassLoader是否已加载该类:以ClassLoader和类全名为key到SystemDictionary 查询;
- 若查询不到则委托父类加载器加载;
- 若仍加载不到,则调用findClass();