一、背景
想在自己开发的项目上加一个算法工具类用来整合不同的算法,并且要求低耦合符合开闭原则,于是想到了《大话设计模式》里的策略模式,但是书中的策略模式还没有达到完全符合开闭原则,同时我在文章结尾看见说可以运用反射机制来大幅降低代码的耦合度,因此开始在学习如何实现,在学习过程中发现需要写一个方法用来找到指定接口的实现类,因此开启了这趟学习之旅。策略模式改进文章:通过反射机制实现一个完美的策略模式
二、寻求答案的路途
刚开始看到根据指定接口找到其实现类,我一下子就想到的Spring,Spring中有一个现成的方法getBeansOfType、getBeanNamesForType刚好符合我们的要求,这个方法就是获取指定bean的所有具体实现类,可以直接拿过来用,用法如下:
//applicationContext通过ApplicationAware自动注入
//key位 beanName,value为bean
Map result = applicationContext.getBeansOfType(Interface.class);
//返回 beanName 的String 数组
String[] result = applicationContext.getBeanNamesForType(Interface.class);
但是我更想要自己实现一个自己用,因为Spring的方法会遍历搜索所有的实例来判断找出其实现类,而我个人是打算把算法的接口和具体实现都方在同一个包里,没打算放其他地方,所以完全没有必要循环遍历所有的实例
既然要自己实现就先看看别人怎么写的,最好能直接找到别人实现好的轮子
java最全的获取某个接口或者某个类所有对应的所有实现类和继承类的工具类--反射动态获取、非动态获取、按照路径获取等总结
这篇博客的大致思路是:
(1)获取当前线程的ClassLoader对象
(2)根据ClassLoader获取目录对象,并对目录里的文件进行遍历
(3)过滤出.class为结尾的文件,并加载到Vector中
(4)然后对Vector中的类进行判断是不是指定接口的实现类
(5)返回所有符合的类
这篇文章给出了两种实现方式,但是还是有不足支持,这篇文章只能在自己本地测试运行使用,无法应用线上,项目发到线上代码打包成jar包后,这种方式就无法使用了
第二篇文章:获取全部子类或接口的全部实现
这一篇博客给出了两种方式,并同时给出了jar包的处理方法,用到了JarFile工具类,并且实现了全路径的搜索。
第三篇文章:获取Java接口的所有实现类
这篇文章直接实现了我想要的东西并作了总结,