这几天在熟悉Swagger的时候,发现它没有提供为自定义对象属性赋随机值的功能(如果有的话,请告知一下),于是自己就写了一个能生成对象随机属性值的工具类,主要用到了反射机制、注解、随机类。具体的代码如下所示:
随机生成对象属性值的类:
public class RandomObjectValue {
public static T getObject(Class> clazz) {
T t = null;
if (clazz == null) {
return t;
}
if((t = (T)getPrimitive(clazz))!= null){
return t;
}
//需要有无参的构造器
try {
t = (T)clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Field[] fields = clazz.getDeclaredFields();
//属性字段
String fileName = "";
//符合JavaBean规则的属性
PropertyDescriptor property = null;
//set方法对象
Method method = null;
for (int i = 0; i < fields.length; i++) {
//属性字段
fileName = fields[i].getName();
//获取属性上的注解
FormatAnnotation annotation = fields[i].getAnnotation(FormatAnnotation.class);
try {
property = new PropertyDescriptor(fileName, clazz);
} catch (IntrospectionException e) {
//没有设置set方法,或者不符合JavaBean规范
continue;
}
//获取set方法对象
method = property.getWriteMethod();
//如果是字节类型(包含基本类型和包装类)
if (fields[i].getType() == byte.class || fields[i].getType() == Byte.class) {
try {
method.invoke(t, SelfUtils.getByteValue());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//如果是short类型(包含基本类型和包装类)
else if (fields[i].getType() == short.class || fields[i].getType() == Short.class) {
try {
method.invoke(t, SelfUtils.getShortValue());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//如果是char类型(包含基本类型和包装类)
else if (fields[i].getType() == char.class || fields[i].getType() == Character.class) {
try {
method.invoke(t, SelfUtils.getCharValue());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//如果是整型(包含基本类型和包装类)
else if (fields[i].getType() == int.class || fields[i].getType() == Integer.class) {
try {
//为属性赋值
method.invoke(t, SelfUtils.getIntValue());
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果是float(包含基本类型和包装类)
else if (fields[i].getType() == float.class || fields[i].getType() == Float.class) {
try {
//为属性赋值
method.invoke(t, SelfUtils.getFloatValue());
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果是double(包含基本类型和包装类)
else if (fields[i].getType() == double.class || fields[i].getType() == Double.class) {
try {
//为属性赋值
method.invoke(t, SelfUtils.getDoubleValue());
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果是double(包含基本类型和包装类)
else if (fields[i].getType() == long.class || fields[i].getType() == Long.class) {
try {
//为属性赋值
method.invoke(t, SelfUtils.getDoubleValue());
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果是boolean(包含基本类型和包装类)
else if (fields[i].getType() == boolean.class || fields[i].getType() == Boolean.class) {
try {
//为属性赋值
method.invoke(t, SelfUtils.getBooleanValue());
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果是boolean(包含基本类型和包装类)
else if (fields[i].getType() == String.class) {
try {
//为属性赋值
method.invoke(t, SelfUtils.getRamdomString(8));
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果是日期类型
else if (fields[i].getType() == Date.class) {
try {
method.invoke(t, SelfUtils.getDateValue());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//如果是List类型
else if (fields[i].getType().isAssignableFrom(List.class)) {
//获取泛型
Type type = fields[i].getGenericType();
//如果不是泛型,不做处理
if (type == null) {
continue;
}
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType)type;
Class> genericClazz = (Class)parameterizedType.getActualTypeArguments()[0];
int length = 0;
String listLength = "4";
if (annotation != null) {
listLength = annotation.listLength();
}
if (StringUtils.isEmpty(listLength) || !listLength.matches(RegularExpression.allNumber)) {
length = 4;
}
length = Integer.parseInt(listLength);
List
public class SelfUtils {
private static Random random = new Random();
private static char[] ch = {'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z'};
public static String getRamdomString(int length) {
// char[] ch = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
// 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
// 'Z', 'a', 'b',
// 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
// 'u', 'v', 'w',
// 'x', 'y', 'z', 'o', '1'};
if (length <= 0) {
length = ch.length;
}
char[] chars = new char[length];
for (int i = 0; i < length; i++) {
chars[i] = ch[random.nextInt(ch.length)];
}
return new String(chars);
}
public static int getIntValue() {
return random.nextInt(1000);
}
public static byte getByteValue() {
return (byte)(random.nextInt() & 0xEF);
}
public static long getLongValue() {
return random.nextLong();
}
public static short getShortValue() {
return (short)(random.nextInt() & 0xEFFF);
}
public static float getFloatValue() {
return random.nextFloat();
}
public static double getDoubleValue(){
return random.nextDouble();
}
public static char getCharValue() {
return ch[random.nextInt(ch.length)];
}
public static boolean getBooleanValue() {
return random.nextInt()%2 == 0;
}
public static Date getDateValue() {
return new Date();
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FormatAnnotation {
/**
* 日期的格式
* @return
*/
String dateFormat() default "yyyy-MM-dd hh:mm:ss";
/**
* list集合的长度
* @return
*/
String listLength() default "4";
/**
* map集合的长度
* @return
*/
String mapLength() default "4";
}
public class RegularExpression {
public static final String allNumber = "[0-9]{1,}";
}