世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
场景 :传输类与实体类之间的转换
前提 :存在的字段名必须一一对应
使用 :
@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;
}
}