Java 对象转换工具

2016/01/01 Java

自己写的一个对象转换的小工具。

代码

/**
 * 类型转换接口, 将 F 类型的对象转换成 T 类型
 */
@FunctionalInterface
interface Converter<F, T> {
    T convert(F src);
}
/**
 * 可逆转换器
 */
interface ReversibleConverter<F, T> {
    /**
     * 正向转换
     */
    T toDest(F src);

    /**
     * 逆向转换
     */
    F toSrc(T dest);
}
/**
 * 转换器上下文,用于封装具体的转换器
 */
public class ConvertContext {

    /**
     * 缓存的转换器  fromCls, toCls  --> converter
     */
    private static Table<Class, Class, Converter> converters = HashBasedTable.create();

    static {
        regist(Short::valueOf, short.class);
        regist(Short::valueOf, Short.class);

        regist(Integer::valueOf, int.class);
        regist(Integer::valueOf, Integer.class);

        regist(Long::valueOf, long.class);
        regist(Long::valueOf, Long.class);

        regist(Double::valueOf, double.class);
        regist(Double::valueOf, Double.class);

        regist(Float::valueOf, float.class);
        regist(Float::valueOf, Float.class);

        regist(String::valueOf, String.class);

        regist(from -> "TRUE".equalsIgnoreCase(from) || "1".equals(from), boolean.class);
        regist(from -> "TRUE".equalsIgnoreCase(from) || "1".equals(from), Boolean.class);
    }

    /**
     * 注册从 from 类型转换为 to 类型的转换器
     */
    private static <F, T> void regist(Class<F> from, Converter<F, T> converter, Class<T> to) {
        converters.put(from, to, converter);
    }

    /**
     * 注册从 String 转换为 to 类型的转换器
     */
    private static <T> void regist(Converter<String, T> converter, Class<T> to) {
        regist(String.class, converter, to);
    }

    /**
     * 注册从 to 类型转换为 String 类型的转换器
     */
    private static <F> void regist(Class<F> from, Converter<F, String> converter) {
        regist(from, converter, String.class);
    }

    /**
     * 获取从 from 到 to 的转换器
     */
    private static <F, T> Converter<F, T> get(Class<F> from, Class<T> to) {
        return (Converter<F, T>) converters.get(from, to);
    }

    /**
     * 是否有转换器支持
     *
     * @param from 转换前的类型
     * @param to   转换后的类型
     * @return 是否存在转换前
     */
    private static <F, T> boolean isSupport(Class<F> from, Class<T> to) {
        return converters.contains(from, to);
    }

    /**
     * 是否有转换器支持从 String  转换为 to 类型
     *
     * @param to 转换后的类型
     * @return 是否存在转换前
     */
    private static <T> boolean isSupportFromStr(Class<T> to) {
        return isSupport(String.class, to);
    }

    /**
     * 转换操作
     */
    public static <F, T> T doConvert(Class<F> from, F src, Class<T> to) {
        if (src == null) return null;
        if (!isSupport(src.getClass(), to))
            throw new IllegalArgumentException("don't support convert from " + src.getClass() + " to " + to.getName() + " with object " + src);//不支持的转换
        Converter<F, T> converter = get(from, to);
        return converter.convert(src);
    }

    /**
     * 转换操作
     */
    public static <F, T> T doConvert(F src, Class<T> to) {
        return doConvert((Class<F>) src.getClass(), src, to);
    }
}

Search

    Table of Contents