在自动化MyBatis SQL语法检测工具中需要根据入参自动生成java对象。我们通过抽取出对象工厂类来优化生成对象的逻辑。从而提高我们的代码的可维护性与可扩展性。
用户可以通过两种方式自动生成对象:第一种方式,传入对象的全限定名;第二种方式,传入对象的class。
@Slf4j
public class ModelFactory {
public static final String JAVA_LANG_CLASS = "java.lang.Class";
private static String STR_AAA = "AAA";
private static Integer INT_111 = 111;
private static Long LONG_222 = 222L;
private String randomString() {
return STR_AAA + RandomStringUtils.randomAlphanumeric(5);
}
public static void main(String[] args) {
ModelFactory modelFactory = new ModelFactory();
// Object model = modelFactory.getModel("com.one.UserDetail");
Object model = modelFactory.getModel(UserDetail.class);
log.info(JsonUtils.toJSONString(model));
}
/**
* 生成实例。
* @param modelName。实例,"com.demo.UserDetail"
* @return
*/
public Object getModel(String modelName) {
try {
Class clazz = Class.forName(modelName);
return getModel(clazz);
} catch (ClassNotFoundException ex) {
log.error("getModel error.", ex);
}
return null;
}
/**
* 生成实例
* @param clazz。 实例,UserDetail.class
* @return
*/
public Object getModel(Class clazz) {
try {
if (JAVA_LANG_CLASS.equals(clazz.getName())) {
return null;
}
Object obj = clazz.newInstance();
Field[] declaredFields = clazz.getDeclaredFields();
clazz.getFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
String typeSimpleName = declaredField.getType().getSimpleName();
//特殊字段不处理
if ("levelCode".equals(declaredField.getName())) {
continue;
}
if (Modifier.isFinal(declaredField.getModifiers())) {
continue;
}
if ("String".equals(typeSimpleName)) {
declaredField.set(obj, randomString());
} else if ("Integer".equals(typeSimpleName) || "int".equals(typeSimpleName)) {
declaredField.set(obj, INT_111);
} else if ("Long".equals(typeSimpleName) || "long".equals(typeSimpleName)) {
declaredField.set(obj, LONG_222);
} else if ("Boolean".equals(typeSimpleName) || "boolean".equals(typeSimpleName)) {
declaredField.set(obj, true);
} else if ("List".equals(typeSimpleName)) {
Type genericType = declaredField.getGenericType();
if (genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
Object model = getModel(actualTypeArguments[0].getClass().getName());
declaredField.set(obj, model);
}
} else if ("Map".equals(typeSimpleName) || "HashMap".equals(typeSimpleName)) {
//无法处理map类型
log.info("map filed. " + declaredField.getName());
} else if ("Set".equals(typeSimpleName) || "HashSet".equals(typeSimpleName)) {
//无法处理set类型
log.info("set filed. " + declaredField.getName());
}else if ("Date".equals(typeSimpleName)) {
declaredField.set(obj, new Date());
} else {
String typeName = declaredField.getType().getName();
Object model = getModel(typeName);
declaredField.set(obj, model);
}
}
return obj;
} catch (Exception ex) {
log.error("getModel error.", ex);
}
return null;
}
}
注意,此对象工厂无法自动填充对象中的Map和Set类型属性值。因为无法获得Map和Set属性值的value对象。