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);
如果没有实际应用,本篇将没有任何意义,具体运用见文末推荐。