newbox - 通过反射实现对象之间的自动赋值

112 阅读1分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

场景 :传输类与实体类之间的转换
前提 :存在的字段名必须一一对应

使用 :

@Data
public class User1 {

    private String name1;
    private String name2;
}

@Data
public class User2 {

    private String name1;
}

测试 :
public class EntityConverterTest {

    @Test
    public void convertTest() {

        User2 user2 = EntityConverter.convert(
                EntityBuilder.create(User1.class)
                .set(User1::getName1, "1")
                .set(User1::getName2, "1")
                .build(),
                User2.class
        );

        System.out.println(user2);
    }
}


# 结果
User2(name1=1)

实现 :

public final class HbwEntityConverter {

    private HbwEntityConverter() {}

    private static final String SET = "set";
    private static final String GET = "get";

    public static <T> T convert(Object o, Class<T> to) {

        return getObject(o, to);
    }

    private static <T> T getObject(Object o, Class<T> to) {

        Map<String, Method> methodMap = getMethodMap(o);

        try {

            T t = to.newInstance();

            Method[] methods1 = to.getMethods();

            for(Method method : methods1) {
                if (method.getName().startsWith(SET)) {

                    method.invoke(t, methodMap.get(method.getName()).invoke(o));
                }
            }

            return t;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    private static Map<String, Method> getMethodMap(Object o) {

        Method[] methods =  o.getClass().getMethods();

        Map<String, Method> methodMap = new HashMap<>();

        for (Method method : methods) {

            if (method.getName().startsWith(GET)) {

                String methodName = SET + method.getName().substring(3);

                methodMap.put(methodName, method);
            }
        }

        return methodMap;
    }
}