自动填充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)