使用范围:前端表单请求转换成后端实体类
技术
使用了反射包扫描获取实现类
代码
类型转换责任链
类型转换链
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>