为啥说java spi破坏双亲委派模型( 六 )

实际上可以看到forName注释中有一个重载的方法
@CallerSensitiveClass.forName(className, true, currentLoader)这俩方法是一个意思,都是需要指定类加载器,而且这俩方法上还有一个注解CallerSensitive,标识调用方敏感。
再看forName中调用forName0的地方,传入了一个类加载器,由ClassLoader.getClassLoader(caller)获取,这个参数就是调用方的类,也就是用户自己的类加载器,而不是BootStrapClassLoader,所以Class.forName()去加载SPI的实现类的时候,使用的是当前调用者的类加载器,如果没有自己定义类加载器,则是使用的AppClassLoader。

■网友
还有为什么要用spi机制,只是为了方便吗?感觉是为了面向接口编程,接口与实现完全分离,不需要Class.forName(“XXX”) 代码(个人理解)spi加载的类通过Class.forName()是不是同样可以加载?当然可以spi所用的classLoader与Class.forName()所用的是不是同一个loader?spi所用的classLoader 是当前类的类加载器,是AppClassLoader,通过Thread.currentThread().getContextClassLoader() 得到Class.forName()使用的是BootStrapClassLoader


推荐阅读