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);
如果沒有實際應用,本篇將沒有任何意義,具體運用見文末推薦。
