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);
如果没有实际应用,本篇将没有任何意义,具体运用见文末推荐。
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/14149970.html