• 反射动态创建泛型类中泛型对应类的实例


     1 public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
     2  
     3     private T model;
     4     @Override
     5     public T getModel() {
     6         
     7         return model;
     8     }    
     9     //****给model创建对象****
    10     public BaseAction(){
    11         System.out.println("baseAction抽象类的构造方法,抽象类可以有构造方法,但不能创建实例,抽象类的构造方法存在的意义是在创建子类对象的时候,进行一定的初始化工作,如此处定义的构造方法便是这个意义");
    12         try {
    13             //System.out.println("BaseAction==============");
    14             
    15             //使用反射创建model对象
    16             //1.获取子类类型: StandardAction.class
    17             //this:当前运行时的实例
    18             //System.out.println(this.getClass()+"====");
    19             Class clz = this.getClass();//this指的是当前运行的实例(子类实例)
    20             
    21             /*
    22             private int a;                   TypeVariable
    23             private int[] a;                GenericArrayType
    24             private Student a;                WildcardType 
    25             private List<Student> a;        ParameterizedType
    26             
    27             */
    28             //2.获取类的泛型父类 : BaseAction<Standard>
    29             //Type: 是Java里面所有类型的父接口
    30             Type type = clz.getGenericSuperclass();//获取泛型父类,必须用该方法,此处的泛型父类不是指当前的类,而是具体继承的BaseAction<Standard>,当前类为BaseAction<T>泛型尚未确定
    31             
    32             //3.把Type转换为具体的类型: BaseAction<Standard>
    33             ParameterizedType pt = (ParameterizedType)type;//将泛型父类转换为具体的那种类型
    34             
    35             //4.从具体类型中获取泛型  : Standard.class
    36             //System.out.println(pt.getActualTypeArguments()[0]);
    37             
    38             Class modelClass = (Class)pt.getActualTypeArguments()[0];//获取具体泛型类Action中的泛型
    39             
    40             //5.创建泛型类的的对象
    41             model = (T) modelClass.getConstructor().newInstance();
    42         } catch (Exception e) {
    43             e.printStackTrace();
    44         }
    45     }
    46 }
     1 /**
     2      * 反射实例化泛型
     3      *
     4      * @throws ClassNotFoundException
     5      * @throws InstantiationException
     6      * @throws IllegalAccessException
     7      * @throws NoSuchMethodException
     8      * @throws InvocationTargetException
     9      */
    10     void initModel() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
    11         ParameterizedType pt = (ParameterizedType) getClass().getGenericSuperclass();
    12         String parameterClassName = pt.getActualTypeArguments()[0].toString().split("\s")[1];
    13         Class<T> clz = (Class<T>) Class.forName(parameterClassName);
    14         Constructor c = clz.getDeclaredConstructor(new Class[]{String.class});
    15         T model= (T) c.newInstance(new Object[]{parameterClassName});
    16     }
  • 相关阅读:
    Backtracking_37. 解数独
    Backtracking_131. 分割回文串
    DFS_90. 子集 II
    DFS_78. 子集
    DFS_216. 组合总和 III
    非对称加密和ssh免密登陆验证、邮件发送接收、网站CA证书验证
    hibernate一对多哪一方放弃权利?
    关于java转json的一些细节问题
    一个web程序中访问频率较高的url为什么要加时间戳?(特别是异步加载)
    阿里电面经验
  • 原文地址:https://www.cnblogs.com/lgjava/p/12016709.html
Copyright © 2020-2023  润新知