zoukankan      html  css  js  c++  java
  • JAVA-使用反射创建class的实例对象

      

     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 }
  • 相关阅读:
    2018年度总结
    SQL特殊comment语法
    mysql 主从复制change master to
    mysql 主从复制参数slave_net_timeout
    show master status, show slave status中的Executed_Gtid_Set
    mysql重复start slave、stop slave测试
    golang database sql DSN (Data Source Name)中的timeout, readTimeout
    mysql show master status为空值
    Linux 建立 TCP 连接的超时时间分析(解惑)
    golang 原子操作函数
  • 原文地址:https://www.cnblogs.com/zhaohuaxishi/p/14200668.html
Copyright © 2011-2022 走看看