为啥说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
推荐阅读
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 为啥到现在你还没有女朋友 ?
