前言
最近做报文解析,不同交换机不同格式,大概有一百台交换机,我想解析用策略模式来写解析模板的方法的,但是写的时候发现,要先根据报文来决定用哪个实现类,这很麻烦。所以我就想用反射获取接口的所有实现类,先用实现类里面的校验方法,走都一边,哪个返回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项目中是自动会注入的,可参考下面这篇文章 《Java设计模式之3种策略模式实现》
当我们拿到匹配结果为true时可以进行解析了~