类加载的双亲委派模型
从顶向底依次的类加载器为:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器。
原理:当执行一个类加载请求时,类加载器自底向顶委派加载任务,委派失败再自己搞定,这一思想真是智慧,实现简单又能解决程序中各种混乱同名类的问题,很好地对基础类进行了统一的管理。当然,没有完美的设计,文中列举的三次模型被破坏,都是人们对更优秀程序需求导致的,而每次的解决方案也都很有意思。
第一次:为了兼容在引入双亲委派模型之前就存在的用户自定义类,设计出重写findClass()方法,自定义的类加载逻辑在这里面实现,而双亲委派思想在loadClass()中实现,再由它调findClass()。这里就体现了一个公用不变逻辑抽象抽离的思想。
第二次:该模型有一个核心就是最基础的先加载,以供用户代码使用。然而引入JNDI后,却出现了需要在基础类中调用用户代码的场景。于是有了线程上下文类加载器,虽然文中说是不太优雅的设计,但我觉得还是挺聪明的,对于需要加载SPI具体实现的场景,系统加载器够不着用户代码,就委托给线程上下文类加载器,而这个加载器默认情况返回的就是应用程序类加载器,由此实现父到子的逆向调用。也可以自己设置线程上下文类加载器。
第三次:由于对程序热部署模块化即插即用的需求,每次用户代码改变,类加载都走一套自底向顶委派的模型显然无法满足。所以结合原有树状模型再拓展出其余网状结构,委派的动作可以在同级同层传递,就无需重启程序一层一层向上禀报。OSGI就是这一思想的实现。
总之,感慨下人们的智慧是无穷的。
来源:oschina
链接:https://my.oschina.net/zerzer/blog/3231107