关于非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时可以进行解析了~

经验分享 程序员 微信小程序 职场和发展