关于非Spring环境下策略模式自动匹配策略的方式
前言
最近做报文解析,不同交换机不同格式,大概有一百台交换机,我想解析用策略模式来写解析模板的方法的,但是写的时候发现,要先根据报文来决定用哪个实现类,这很麻烦。所以我就想用反射获取接口的所有实现类,先用实现类里面的校验方法,走都一边,哪个返回true了,就终止把他来出来,让他执行里面的解析。
环境
jdk8, hutool5.8.5
代码
寻找接口的实现类
private static Set<Class<?>> getInstances(Class supClass) { String aPackage = ClassUtil.getPackage(supClass); Set<Class<?>> classes = ClassUtil.scanPackage(aPackage); return classes.stream().filter(sonClass -> { boolean allAssignableFrom = ClassUtil.isAllAssignableFrom(new Class[]{ supClass}, new Class[]{ sonClass}); //要将 本身排除 return allAssignableFrom && sonClass != supClass; }).collect(Collectors.toSet()); }
注意,这里找的是接口同级或者在他的下一层才可以搜索的到,一般情况下写策略不会跨包的吧!
import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ReflectUtil; import java.util.Set; import java.util.stream.Collectors; public class Test22 { public static void main(String[] args) throws Exception { Set<Class<?>> instances = getInstances(ParentInterface.class); for (Class<?> instance : instances) { Object o1 = ReflectUtil.newInstance(instance); Object result = ReflectUtil.invoke(o1, "log"); System.out.println("result = " + result); } } }
到这里我想已经可以明白,我要的就是要把所有的策略都放在一个集合里,spring项目中是自动会注入的,可参考下面这篇文章 当我们拿到匹配结果为true时可以进行解析了~