就是我们写的java源文件到最终运行,必须要经过编译和类加载这两个阶段。编译的过程就是把 .java 文件编译成 .class文件。
而在类加载的过程中,如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父
类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父
加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
这样做的优点,我认为有这么几个:首先就是保证了安全性,因为这种层级关系实际代表的是一种优先级,也就是所有的类的加载,优先给启动类加载器,那么对于核心类库中的类,就没办法去破坏,比如自己写一个 java…lang.String,最终还是会交给启动类加载器,再加上每个类加载器的作用范围,那么自己写的 String 类就没办法覆盖java类库中的类。
再就是可以避免重复加载导致程序混乱的问题,因为父加载器已经加载过了,那么子类就没必要去加载了。
如何打破双亲委派机制:重写 loadclass 方法
jdbc破坏双亲委派
原生的JDBC中Driver驱动本身只是一个接口,并没有具体的实现,具体的实现是由不同数据库类型去实现的。例如,MySQL的mysql-connector-.jar中的Driver类具体实现的。 原生的JDBC中的类是放在rt.jar包的,是由启动类加载器进行类加载的,在JDBC中的Driver类中需要动态去加载不同数据库类型的Driver类,而mysql-connector-.jar中的Driver类是用户自己写的代码,那启动类加载器肯定是不能进行加载的,既然是自己编写的代码,那就需要由应用程序启动类去进行类加载。于是乎,这个时候就引入线程上下文件类加载器(Thread Context ClassLoader)。有了这个东西之后,程序就可以把原本需要由启动类加载器进行加载的类,由应用程序类加载器去进行加载了。
tomcat打破双亲委派机制