类从编译到执行的过程
ClassLoader
通过ClassLoader类加载器把class文件加载到JVM内存中,生成class对象【如何加载.class文件】
loadClass() :加载到类,返回实例
种类
ExtClassLoader:getExtDirs()查询路径中需要的class文件,加载
AppClassLoader:加载classpath目录下定义的class
自定义ClassLoader的实现
findClass(String):加载字节码
defineClass(byte[]):解析字节码返回对象
ClassLoader的源码
类加载器的双亲委派机制
- 加载一个类时,首先查看当前ClassLoader有没有加载过(加载过即表示之前加载过并放放置在缓存中了,查看缓存中有没有)
getClassLoader()
- 若加载过则直接返回;否则查看其父类
getClassLoader().getParent()
有没有加载过此类,层层递归直到顶层,加载过就返回 - 若还没有找到,则让当前ClassLoader执行真正的加载过程
优势
- 提高了类加载的效率
- 系统类被提前加载,提高了系统的安全性
为什么要使用双亲委派机制去加载类
避免多份同样字节码的加载
补充学习点
深入理解ClassLoader工作机制(jdk1.8)
ClassLoader 详解及用途
注:以上图片来源:慕课-翔仔