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

  如果沒有實際應用,本篇將沒有任何意義,具體運用見文末推薦。

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM