1 public class EntityUtils{
2
3 // 具有默认值的类型的集合 (基本类型,基本类型的包装类, BigDecimal , Date ,String,等)
4 public static Map<String,Object> defaultType = new HashMap<>();
5
6
7 static{
8
9 // 基本类型
10 defaultType.put("int",0);
11 defaultType.put("byte",0);
12 defaultType.put("short",0);
13 defaultType.put("boolean",false);
14 defaultType.put("char",'a');
15 defaultType.put("float",0.1f);
16 defaultType.put("double",0.1d);
17 defaultType.put("long",0L);
18
19 // 包装类
20 defaultType.put("java.lang.Integer",0);
21 defaultType.put("java.lang.Byte",0);
22 defaultType.put("java.lang.Short",0);
23 defaultType.put("java.lang.Boolean",false);
24 defaultType.put("java.lang.Character",'a');
25 defaultType.put("java.lang.Float",0.1f);
26 defaultType.put("java.lang.Double",0.1d);
27 defaultType.put("java.lang.Long",0L);
28
29 // 其他有默认值的类型
30 defaultType.put("java.lang.String","null");
31 defaultType.put("java.math.BigDecimal",BigDecimal.ZERO);
32 defaultType.put("java.util.Date",new Date());
33
34
35 // 获取class的实例对象
36 public static Object getInstance(Class clazz){
37 // 枚举 , 获取已经定义的第一个实例对象
38 if(clazz.isEnum()){
39 return clazz.getEnumConstants()[0];
40 }
41
42 // 有默认值的类型
43 if(defaultType.containsKey(clazz.getName())){
44 return defaultType.get(clazz.getName());
45 }
46
47
48 // 使用 builder方法 ( 会用 lombok提供的 @Builder 才会具备该方法)
49 try{
50 Method bulder = clazz.getDeclaredMethod("builder");
51 Object builderResult = builder.invoke(clazz);
52 Method build = builderResult.getClass().getDeclaredMethod("build");
53 return build.invoke(builderResult);
54 }catch(NoSuchMethodException e){
55 // 如果clazz没有 builder方法,会抛出异常 NoSuchMethodException ,此处忽略
56 }
57
58 Object result=null;
59
60 // 通过构造函数创建实例
61 Constructor minCt = Arrays.stream(clazz.getDeclaredConstructors())
62 // 取形参列表最小的构造函数
63 .min(Comparator.comparing(Constructor::getParamterCount))
64 // 如果没有构造函数,则抛出异常
65 .orElseThrow(()-> new Exception("没有可用的构造函数"));
66
67 if(minCt.getParamterCount()==0){
68 // 无参构造
69 result = clazz.newInstance();
70 }else{
71 // 有参构造
72 Class[] paramterTypes = minCt.getParamterTypes();
73 Object[] paramters = new Object[paramterTypes.length];
74
75 // 创建形参列表
76 for(int i=0 ; i<paramterTypes.length ; i++){
77 paramters[i] = getInstance(paramterTypes[i]);
78 }
79
80 result = minCt.newInstance(paramters);
81
82 }
83
84 if(result == null){
85 throw new Exception("构造实例失败,没有可用的构造函数 或 @Builder ")
86 }
87
88 return result;
89
90 }
91
92 }
93
94 }