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);

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

写在最后

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

 相关推荐:

原文地址:https://www.cnblogs.com/Marydon20170307/p/14149970.html