zoukankan      html  css  js  c++  java
  • java 创建带构造参数的泛型实例 T t = new T("123")

    1.情景展示

      在java中,泛型用的熟练的话,创建实例将不是难事,难点在于:在实例化对象的时候带构造参数,例如:

      BigDecimal bg = new BigDecimal(1);

      如何使用泛型实现这样的效果?

      本质:通过反射来完成

    2.生成无参泛型对象

      举个栗子:

    /*
     * 创建无参泛型对象
     * @description: 实例化对象,相当于:
     * T newInstance = new T();
     * @date: 2020年12月17日 0017 15:19
     * @param: t
     * @return: T
     */
    public <T> T getInstanceNoParam(T t) {
        try {
            return (T) t.getClass().newInstance();
        } catch (Exception e) {
            return null;
        }
    }
    

      说明:该方法本身并没有实际意义,不要追究。  

      关键点在于:class.newInstance()。

    3.生成带参泛型实例

      一个构造参数:

    /*
     * 通过一个参数来创建泛型对象
     * @description: 实例化对象,相当于:
     * T newInstance = new T(p);
     * @date: 2020年12月17日 0017 15:23
     * @param: t
     * @param: p 构造参数
     * @return: T 实例对象
     */
    public <T, P> T getInstanceOneParam(T t, P p) {
        try {
            Constructor<?> constructor = t.getClass().getConstructor(p.getClass());
            return (T) constructor.newInstance();
        } catch (Exception e) {
            return null;
        }
    }  

      多个构造参数:

    /*
     * 根据class名称创建对象
     * @attention: 
     * @date: 2020年12月17日 0017 15:29
     * @param: className
     * @param: args
     * @return: java.lang.Object
     */    
    public Object newInstance(String className, Object[] args) throws Exception {
        Class newoneClass = Class.forName(className);
        Class[] argsClass = new Class[args.length];
        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }
        Constructor cons = newoneClass.getConstructor(argsClass);
        return cons.newInstance(args);
    }
    

      它俩的本质是一样的:

      第一步:创建有参构造方法;

      Class.getConstructor(param.class);

      第二步:通过构造方法创建对象;

      Constructor.newInstance(param);

      如果没有实际应用,本篇将没有任何意义,具体运用见文末推荐。

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    括号匹配性检测C语言实现
    预处理命令--宏定义
    *运算和&运算
    retain, copy, assign以及autorelease
    自定义 一个单例
    多米音乐笔试题
    UI-自定义视图、视图控制器
    Foundation框架—集合
    Foundation框架—字符串
    Foundation框架—结构体
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14149970.html
Copyright © 2011-2022 走看看