类型转换链(传递处理-所有要过一遍)

类型转换链(传递处理-所有要过一遍)

使用范围:前端表单请求转换成后端实体类

技术

使用了反射包扫描获取实现类

代码

类型转换责任链

类型转换链

public class TypeSwitchChain {
    private Iterator<TypeSwitch> iterator;
    private static List<Class<?>> classList;

    static {
        classList = ScanUtils.scanImpl(TypeSwitch.class, "top.lldwb.db.util.type.typeswitch");
    }

    public TypeSwitchChain() {
        List<TypeSwitch> list = new ArrayList<>();
        classList.forEach(clazz -> {
            try {
                list.add((TypeSwitch) clazz.newInstance());
            } catch (InstantiationException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        });
        iterator = list.listIterator();
    }

    public Object doTypeSwitch(Class<?> clazz, Object value) {
        if (iterator.hasNext()) {
            TypeSwitch typeSwitch = iterator.next();
            return typeSwitch.valueOf(this, clazz, value);
        } else {
            throw new RuntimeException("没有对应的链");
        }
    }
}

类型转换接口

public interface TypeSwitch {
    /**
     * 可以处理返回值
     * 不可以处理返回 null
     *
     * @param clazz 字段类型
     * @param value 需要转换的值
     * @return
     */
    Object valueOf(TypeSwitchChain typeSwitchChain, Class<?> clazz, Object value);
}

类型转换实现类

String 类型转换
public class StringSwitch implements TypeSwitch {
    @Override
    public Object valueOf(TypeSwitchChain typeSwitchChain, Class<?> clazz, Object value) {
        if (clazz == String.class) {
            return value;
        } else {
            return typeSwitchChain.doTypeSwitch(clazz,value);
        }
    }
}
Integer 类型转换
public class IntegerSwitch implements TypeSwitch {
    @Override
    public Object valueOf(TypeSwitchChain typeSwitchChain, Class<?> clazz, Object value) {
        if (clazz == Integer.class || clazz == Integer.TYPE) {
            return Integer.valueOf(value.toString());
        } else {
            return typeSwitchChain.doTypeSwitch(clazz, value);
        }
    }
}

扫描包工具类

public class ScanUtils {

    /**
     * 扫描指定的包,并返回相关的Class对象
     *
     * @param packages
     * @return
     */
    public static List<Class<?>> scan(String... packages) {
        try (ScanResult scan = new ClassGraph().enableAllInfo().acceptPackages(packages).scan()) {
            return scan.getAllClasses().loadClasses();
        }
    }

    /**
     * 扫描指定的包,并返回相关的实现类对象
     *
     * @param clazz 接口
     * @param packages 包
     * @return
     */
    public static List<Class<?>> scanImpl(Class<?> clazz, String... packages) {
        List<Class<?>> list = new ArrayList<>();
        ScanUtils.scan(packages).forEach(aClass -> {
            if (clazz.isAssignableFrom(aClass)) {
                list.add(aClass);
            }
        });
        return list;
    }
}

依赖

<!-- https://mvnrepository.com/artifact/io.github.classgraph/classgraph -->
<dependency>
    <groupId>io.github.classgraph</groupId>
    <artifactId>classgraph</artifactId>
    <version>4.8.158</version>
</dependency>