转自:http://blog.csdn.net/zknxx/article/details/70197884
这几天在熟悉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
- for (int j = 0; j < length; j++) {
- list.add(getObject((Class
)genericClazz)); - }
- try {
- method.invoke(t, list);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- //如果是Map类型
- else if(fields[i].getType().isAssignableFrom(Map.class)){
- //获取泛型
- Type types = fields[i].getGenericType();
- //如果不是泛型的话则不处理
- if(types == null){
- continue;
- }
- if(types instanceof ParameterizedType){
- int length = 4;
- if(annotation != null){
- String lengthStr = annotation.mapLength();
- if(!StringUtils.isEmpty(lengthStr) && lengthStr.matches(RegularExpression.allNumber)){
- length = Integer.parseInt(lengthStr);
- }
- }
- ParameterizedType parameterizedType = (ParameterizedType)types;
- Map
- for(int j=0;j
- map.put(getObject((Class>)parameterizedType.getActualTypeArguments()[0]),
- getObject((Class>)parameterizedType.getActualTypeArguments()[1]));
- }
- try {
- method.invoke(t,map);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- //这里默认处理的是自定义对象
- else {
- try {
- Object obj = getObject(fields[i].getType());
- method.invoke(t,obj);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- return t;
- }
- private static Object getPrimitive(Class> clazz) {
- //如果是byte类型(包含基本类型和包装类)
- if (clazz == byte.class || clazz == Byte.class) {
- return SelfUtils.getByteValue();
- }
- //如果是short类型(包含基本类型和包装类)
- if (clazz == short.class || clazz == Short.class) {
- return SelfUtils.getShortValue();
- }
- //如果是char类型(包含基本类型和包装类)
- if (clazz == char.class || clazz == Character.class) {
- return SelfUtils.getCharValue();
- }
- //如果是整型(包含基本类型和包装类)
- if (clazz == int.class || clazz == Integer.class) {
- //为属性赋值
- return SelfUtils.getIntValue();
- }
- //如果是float(包含基本类型和包装类)
- if (clazz == float.class || clazz == Float.class) {
- //为属性赋值
- return SelfUtils.getFloatValue();
- }
- //如果是double(包含基本类型和包装类)
- if (clazz == double.class || clazz == Double.class) {
- //为属性赋值
- return SelfUtils.getDoubleValue();
- }
- //如果是double(包含基本类型和包装类)
- if (clazz == long.class || clazz == Long.class) {
- //为属性赋值
- return SelfUtils.getDoubleValue();
- }
- //如果是boolean(包含基本类型和包装类)
- if (clazz == boolean.class || clazz == Boolean.class) {
- return SelfUtils.getBooleanValue();
- }
- //如果是boolean(包含基本类型和包装类)
- if (clazz == String.class) {
- //为属性赋值
- return SelfUtils.getRamdomString(8);
- }
- //如果是日期类型
- if (clazz == Date.class) {
- return SelfUtils.getDateValue();
- }
- return null;
- }
- }
- 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,}";
- }