一、JVM内置的类加载器
- BootstrapClassLoader(启动类加载器):用于加载/lib目录下的jar包和类,用C++编写的。
- ExtensionClassLoader(扩展类加载器):用于加载/lib/ext目录下的jar包和类,用Java编写,继承自于java.lang.ClassLoader类。
- AppClassLoader(启动类加载器):用于加载当前classpath下的所有jar包和类,用Java编写,继承自于java.lang.ClassLoader类。
二、双亲委派机制
双亲委派机制:当一个类加载器收到类加载请求时,会先判断该类有没有被加载过,如果被加载过,就会直接返回;反之,就会把请求传给父类加载器,直到BootstrapClassLoader(启动类加载器)处,当父类无法处理时,才会由自己来处理。
双亲委派机制的好处
- 避免类的重复加载,一个类被不同的类加载器加载会产生不同的类。
- 保证Java的核心API不被篡改。
双亲委派机制保证了Java程序的稳定运行。
不想用双亲委派机制应当如何?
首先自定义类加载器,要继承ClassLoader,要想用双亲委派机制,要重写findClass(),但想要打破双亲委派机制的话,要重写loadClass()。