目录
简单工厂模式下,假设核心类和工厂方法由启动类加载器加载,应用类由应用类加载器加载,因为双亲委派模式下上层的类加载器无法访问下层ClassLoader加载的类,所以会导致启动类加载器加载的工厂方法无法创建应用类加载器加载的类的实例。在工厂模式中解决的方式就是把工厂方法抽象出来,具体生成实例的逻辑交由子类来实现,简单工厂模式变成抽象工厂模式,这个在上一篇日志中总结到,那么回到双亲委派问题,JVM解决的方式是在启动类加载器代码中新建一个ClassLoader来完成对下层应用类加载器加载的类的实例化,具体来看看它是怎么做的。
上下文加载器
回到JVM里,工厂模式对应的就是核心类提供个外部类的接口,SPI(Service Provider Interface),这个接口就是外部类需要自己实现业务逻辑的接口,拿DocumentBuilderFactory类举例,该类是一个抽象类,可以实现对XML文件的解析,由启动类加载器加载,所以是一个核心类,类中有一个newInstance方法,负责创建并返回一个DocumentBuilderFactory实例,具体实现在FactoryFind.find()方法中:
public static DocumentBuilderFactory newInstance() {
try {
return (DocumentBuliderFactory) FactoryFinder.find(
"javax.xml.parsers.DocumentBuilderFactory",
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFa

本文介绍了JVM如何通过上下文加载器解决双亲委派模式下核心类加载非核心类的问题。上下文加载器允许核心类通过创建新的ClassLoader实例来加载应用类,从而避免双亲委派的限制。此外,文章还探讨了JDK 9中双亲委派模型的变化,平台类加载器可以直接访问应用类加载器加载的类,打破了原有的单向访问限制。
最低0.47元/天 解锁文章
577

被折叠的 条评论
为什么被折叠?



