自动填充javabean属性,借助json序列化工具方便生成参数请求体

时间:2021-07-09 23:20:52   收藏:0   阅读:23
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.BeanUtils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.BiFunction;


public class FillBeanUtil {

    public static <T> void fill(T target, Map<Class, Integer> map, BiFunction<Class, Map<Class, Integer>, Object> f) throws Exception {
        Class<?> actualEditable = target.getClass();
        PropertyDescriptor[] targetPds = BeanUtils.getPropertyDescriptors(actualEditable);
        PropertyDescriptor[] var7 = targetPds;
        int var8 = targetPds.length;

        for(int var9 = 0; var9 < var8; ++var9) {
            PropertyDescriptor targetPd = var7[var9];
            Method writeMethod = targetPd.getWriteMethod();
            if(writeMethod != null) {
                Class<?> t = writeMethod.getParameterTypes()[0];
                if(List.class.equals(t)) {
                    ArrayList list = new ArrayList();
                    Object tt = randomFillBean((Class) ((ParameterizedType) writeMethod.getGenericParameterTypes()[0]).getActualTypeArguments()[0], map);
                    if(tt != null) {
                        list.add(tt);
                    }
                    writeMethod.invoke(target, list);
                } else {
                    writeMethod.invoke(target, f.apply(writeMethod.getParameterTypes()[0], map));
                }
            }
        }
    }

    public static Class<?> getActualTypeArgument(Class<?> clazz) {
        Class<?> entitiClass = null;
        Type genericSuperclass = clazz.getGenericSuperclass();
        if (genericSuperclass instanceof ParameterizedType) {
            Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass)
                    .getActualTypeArguments();
            if (actualTypeArguments != null && actualTypeArguments.length > 0) {
                entitiClass = (Class<?>) actualTypeArguments[0];
            }
        }

        return entitiClass;
    }

    private static Object randomFill(Class clazz, Map<Class, Integer> map) {
        if (String.class.equals(clazz)) {
            return RandomStringUtils.randomAlphanumeric(20);
        } else if(BigDecimal.class.equals(clazz)) {
            return new BigDecimal(ThreadLocalRandom.current().nextDouble(0, 100))
                    .setScale(6, RoundingMode.UP);
        } else if(int.class.equals(clazz) || long.class.equals(clazz) || char.class.equals(clazz)
            || Integer.class.equals(clazz) || Long.class.equals(clazz) || Character.class.equals(clazz)
        ) {
            return ThreadLocalRandom.current().nextInt(0, 100);
        } else if(boolean.class.equals(clazz) || Boolean.class.equals(clazz)) {
            return (ThreadLocalRandom.current().nextInt(0) & 1) == 0;
        } else if(byte.class.equals(clazz) || Byte.class.equals(clazz)) {
            return (byte) ThreadLocalRandom.current().nextInt(0, 255);
        } else if(float.class.equals(clazz) || double.class.equals(clazz)
            || Float.class.equals(clazz) || Double.class.equals(clazz)) {
            return (float) ThreadLocalRandom.current().nextDouble(0, 100);
        }
        try {
            return randomFillBean(clazz, map);
        } catch (Exception e) {
            return null;
        }
    }

    public static <T> T randomFillBean(Class<T> clazz) throws Exception {
        Map<Class, Integer> map = new HashMap<>();
        return randomFillBean(clazz, map);
    }

    public static <T> T randomFillBean(Class<T> clazz, Map<Class, Integer> map) throws Exception {
        Integer i = map.get(clazz);
        if(i == null) {
            map.put(clazz, 1);
        } else if(i < 2) {
            map.put(clazz, i + 1);
        } else if(i >= 2) {
            return null;
        }
        T t = clazz.getConstructor().newInstance();
        fill(t, map, FillBeanUtil::randomFill);
        return t;
    }

}

需要依赖 apache commons 和 spring-beans包

原文:https://www.cnblogs.com/math-and-it/p/14992296.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!