java存在三种类加载器(这里指的是sun公司提供的,不包括其他供应厂商提供的),
1 .Bootstrap ClassLoader这个类加载器是通过c++实现的,在JVM中,他是在JVM启动的时候加载类的,他加载的是jdk-->jre-->lib-->rt.jar"这个jar包中的类。
2.Extension ClassLoader 他加载的是jdk-->jre-lib-->ext目录中的jar包中的类,他的父类是Bootstrap Classloader
3.Application ClassLoader 它负责从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由-classpath或-cp命令行选项来定义,或者是JAR中的Manifest的classpath属性。Application类加载器是Extension类加载器的子加载器。通过sun.misc.Launcher$AppClassLoader实现,他是System的默认加载器,在项目中他加载的是ClassPath下的jar包。
类加载器存在一个委托机制,
也就是说,当java虚拟机需要加载一个类的时候到底用那个加载器加载,如果在加载这个类的时候,这个类又存在和其他的类的关联,那么则需要加载另外一个类,则需要这个类加载器去加载另外一个类,每个子类加载器去加载类的时候,都会首先去把这个类的加载交给他的父类去加载,父类没有找到的话,就会交给他的子类去加载,如果没有找到则会抛出异常 :ClassNotFoundException,每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。
究竟要类加载器有什么作用呢?
个人通俗的观点:就是加载jar包中的class字节码文件,将其加载到JVm中供其他的代码调用。。。