分享一个能随机初始化java对象属性数据的工具,利用了java反射机制

近期我负责的一个spring boot项目,需要快速规定好api并可以返回模拟数据。项目中我用了swagger。

在编写api的过程中,我发现java模拟数据太麻烦,特别是属性多的时候。需要一个一个赋值。

但我发现其实接口返回的数据大多数还是由类来封装,那么如果能让封装数据这些类的对象的数据自己随机生成,那么将大大减少编码量,于是有了下面的工具。

工具类的代码:

package com.sicau.ipig.utils;
import com.sicau.ipig.entity.*;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
import java.util.Random;


/**
 * CommonUtil
 * create by chenshihang on 2018/12/30
 */
public class CommonUtil {






    /**
     * 初始化类数据
     * @param cls
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> T initClassInfo(Class<T> cls) {
        T bean=null;
        try{
            bean = cls.newInstance();
            Method[] methods = cls.getDeclaredMethods();
            Field[] fields = cls.getDeclaredFields();

            for(Field field:fields){
                String fieldSetName = parSetName(field.getName());
                if (!checkSetMet(methods, fieldSetName)) {
                    continue;
                }
                Method fieldSetMet = cls.getMethod(fieldSetName,
                        field.getType());

                fieldSet(bean,fieldSetMet,field);
            }
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("initClassInfo调用异常");
        }
        return bean;
    }



    


    /**
     * 生成随机数据
     * @param type
     * @return
     */
    private static Object getRandomInfo(String type) {

        try{

            if(type.equals("String")){
                int length = (int) (Math.random()*10);
                String str = "猪猪侠哈哈测试数据拉拉拉老王小王abcdefg1234567890猪大美丽小花冬冬强豆豆新";
                char[] chr = str.toCharArray();
                Random random = new Random();
                StringBuffer buffer = new StringBuffer();
                for (int i = 0; i < length; i++) {
                    buffer.append(chr[random.nextInt(46)]);
                }
                return buffer.toString();
            }else if(type.equals("Date")){
                return new Date();
            }else if(type.equals("Long")){
                return (long)(Math.random()*100000);
            }else if(type.equals("Integer")){
                return (int)(Math.random()*1000);
            }else if(type.equals("int")){
                return (int)(Math.random()*1000);
            }else if(type.equals("Double")){
                return Math.random()*100;
            }else if(type.equals("Boolean")){
                double a = Math.random();
                return a>0.5 ;
            }
        }catch (Exception e){
            System.out.println("未找到匹配类型,初始化数据失败"+type);
        }
        return "haha";


    }

    /**
     * 拼接在某属性的 set方法
     *
     * @param fieldName
     * @return String
     */
    private static String parSetName(String fieldName) {
        if (null == fieldName || "".equals(fieldName)) {
            return null;
        }
        int startIndex = 0;
        if (fieldName.charAt(0) == '_')
            startIndex = 1;
        return "set"
                + fieldName.substring(startIndex, startIndex + 1).toUpperCase()
                + fieldName.substring(startIndex + 1);
    }

    /**
     * 判断是否存在某属性的 set方法
     *
     * @param methods
     * @param fieldSetMet
     * @return boolean
     */
    private static boolean checkSetMet(Method[] methods, String fieldSetMet) {
        for (Method met : methods) {
            if (fieldSetMet.equals(met.getName())) {
//                System.out.println(fieldSetMet+" true");
                return true;
            }
        }
//        System.out.println(fieldSetMet+" false");
        return false;
    }




    /**
     * 调用某个set方法set数据
     * @param bean
     * @param fieldSetMet
     * @param field
     * @throws Exception
     */
    private static void fieldSet(Object bean,Method fieldSetMet,Field field) throws Exception{


        String fieldType = field.getType().getSimpleName();
        Object value = getRandomInfo(fieldType);
        if ("String".equals(fieldType)) {
            fieldSetMet.invoke(bean, (String)value);
        } else if ("Date".equals(fieldType)) {
            Date temp = (Date)value;
            fieldSetMet.invoke(bean, temp);
        } else if ("Integer".equals(fieldType)
                || "int".equals(fieldType)) {
            Integer intval = (Integer)value;
            fieldSetMet.invoke(bean, intval);
        } else if ("Long".equalsIgnoreCase(fieldType)) {
            Long temp = (Long)value;
            fieldSetMet.invoke(bean, temp);
        } else if ("Double".equalsIgnoreCase(fieldType)) {
            Double temp = (Double)value;
            fieldSetMet.invoke(bean, temp);
        } else if ("Boolean".equalsIgnoreCase(fieldType)) {
            Boolean temp =(Boolean)value;
            fieldSetMet.invoke(bean, temp);
        } else {
            System.out.println("未找到匹配类型" + fieldType);
        }
    }




    public static void main(String[] args) throws Exception {


        Material material =initClassInfo(Material.class);
    }
}

  

用于测试的实体类Material

package com.sicau.ipig.entity;

public class Material {
    private Integer id;

    private String category;

    private String name;

    private String productName;

    private String manufactureFactory;

    private String specification;

    private String type;

    private String warehouseUnit;

    private String useUnit;

    private Double unitConversion;

    private Integer validDay;

    private Integer status;

    private String comment;

    private Integer farmId;

    public Material(Integer id, String category, String name, String productName, String manufactureFactory, String specification, String type, String warehouseUnit, String useUnit, Double unitConversion, Integer validDay, Integer status, String comment, Integer farmId) {
        this.id = id;
        this.category = category;
        this.name = name;
        this.productName = productName;
        this.manufactureFactory = manufactureFactory;
        this.specification = specification;
        this.type = type;
        this.warehouseUnit = warehouseUnit;
        this.useUnit = useUnit;
        this.unitConversion = unitConversion;
        this.validDay = validDay;
        this.status = status;
        this.comment = comment;
        this.farmId = farmId;
    }

    public Material() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category == null ? null : category.trim();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName == null ? null : productName.trim();
    }

    public String getManufactureFactory() {
        return manufactureFactory;
    }

    public void setManufactureFactory(String manufactureFactory) {
        this.manufactureFactory = manufactureFactory == null ? null : manufactureFactory.trim();
    }

    public String getSpecification() {
        return specification;
    }

    public void setSpecification(String specification) {
        this.specification = specification == null ? null : specification.trim();
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type == null ? null : type.trim();
    }

    public String getWarehouseUnit() {
        return warehouseUnit;
    }

    public void setWarehouseUnit(String warehouseUnit) {
        this.warehouseUnit = warehouseUnit == null ? null : warehouseUnit.trim();
    }

    public String getUseUnit() {
        return useUnit;
    }

    public void setUseUnit(String useUnit) {
        this.useUnit = useUnit == null ? null : useUnit.trim();
    }

    public Double getUnitConversion() {
        return unitConversion;
    }

    public void setUnitConversion(Double unitConversion) {
        this.unitConversion = unitConversion;
    }

    public Integer getValidDay() {
        return validDay;
    }

    public void setValidDay(Integer validDay) {
        this.validDay = validDay;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment == null ? null : comment.trim();
    }

    public Integer getFarmId() {
        return farmId;
    }

    public void setFarmId(Integer farmId) {
        this.farmId = farmId;
    }
}

  

执行Material material =initClassInfo(Material.class);的结果

 可见对象的数据已经根据我们的规则进行了初始化。

猜你喜欢

转载自www.cnblogs.com/cavinchen/p/10451605.html
今日推荐