为自定义对象生成随机属性值

简介: 这几天在熟悉Swagger的时候,发现它没有提供为自定义对象属性赋随机值的功能(如果有的话,请告知一下),于是自己就写了一个能生成对象随机属性值的工具类,主要用到了反射机制、注解、随机类。具体的代码如下所示: 随机生成对象属性值的类: public class RandomObjectValue { public static <T> T getObject(

这几天在熟悉Swagger的时候,发现它没有提供为自定义对象属性赋随机值的功能(如果有的话,请告知一下),于是自己就写了一个能生成对象随机属性值的工具类,主要用到了反射机制、注解、随机类。具体的代码如下所示:

随机生成对象属性值的类:

public class RandomObjectValue {

    public static <T> 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<Object> list = new ArrayList<>(length);
                    for (int j = 0; j < length; j++) {
                        list.add(getObject((Class<T>)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<Object,Object> map = new HashMap();
                    for(int j=0;j<length;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,}";
}




相关文章
|
Java 关系型数据库 MySQL
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
|
XML JSON 自然语言处理
《ANTLR 4权威指南 》一导读
ANTLR是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。它被广泛应用于学术领域和工业生产实践,是众多语言、工具和框架的基石。
10712 2
|
Java Spring 容器
Java获取接口的所有实现类方法
这篇文章介绍了在Java中获取接口所有实现类的方法,包括使用JDK的ServiceLoader(SPI机制)和Spring Boot中的@Autowired自动注入及ApplicationContextAware接口两种方式。
1083 1
|
XML Java 测试技术
TestNG 与 JUnit 测试框架:哪个更好?
【2月更文挑战第16天】
749 1
TestNG 与 JUnit 测试框架:哪个更好?
|
前端开发 JavaScript
使用 JavaScript 获取 URL 参数的详细指南
【2月更文挑战第26天】
14016 2
使用 JavaScript 获取 URL 参数的详细指南
|
传感器 机器学习/深度学习 算法
【滤波跟踪】基于扩展卡尔曼滤波器实现 IMU 和 GPS 数据计算无人机的姿态附matlab代码
【滤波跟踪】基于扩展卡尔曼滤波器实现 IMU 和 GPS 数据计算无人机的姿态附matlab代码
|
缓存 搜索推荐 机器人
HTTP 状态码完整指南
HTTP 状态码完整指南
1268 0
|
算法
【基础篇】8 # 递归:如何避免出现堆栈溢出呢?
【基础篇】8 # 递归:如何避免出现堆栈溢出呢?
502 0
|
17小时前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产