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包
自动填充javabean属性,借助json序列化工具方便生成参数请求体
原文:https://www.cnblogs.com/math-and-it/p/14992296.html