java泛型工厂需用class对象绕过类型擦除,通过getdeclaredconstructor().newinstance()创建实例;接口定义契约,实现类持运行时类型信息并校验兼容性,支持无参/带参构造器。

Java中泛型工厂接口配合反射创建对象,核心在于**用泛型约束类型、用Class对象驱动反射、避开类型擦除限制**。单纯声明Factory<t></t>无法直接new T(),必须把具体类型信息以Class<t></t>形式传入,再调用newInstance()(或更推荐的getDeclaredConstructor().newInstance())。
泛型工厂接口需携带 Class 参数
接口本身不负责实例化,只定义契约;真正创建动作由实现类完成,且必须显式持有运行时类型信息:
- 不能写
T create()然后内部new T()—— 编译报错,因泛型已被擦除 - 正确做法是定义
<t> T create(Class<t> type)</t></t>或让工厂构造时接收Class<t></t> - 例如:
interface Factory<t> { T create() throws Exception; }</t>的实现类必须在构造时传入Class<t></t>
典型实现:泛型工厂类 + Class.newInstance()
这是最简实践,适用于有无参构造器的类:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
public class SimpleFactory<t> { private final Class<t> type; public SimpleFactory(Class<t> type) { this.type = type; } public T create() throws Exception { return type.getDeclaredConstructor().newInstance(); } }</t></t></t>- 使用:
Factory<string> stringFactory = new SimpleFactory(String.class); String s = stringFactory.create();</string> - 注意:
newInstance()已在 Java 9+ 标记为过时,推荐用getDeclaredConstructor().newInstance()替代,支持私有构造器且更明确
安全增强:校验类型兼容性与异常处理
仅靠泛型声明不能防止误传类型,需运行时校验:
- 用
Class.isAssignableFrom()或Class.isInstance()确保返回对象属于预期类型 - 捕获
NoSuchMethodException、IllegalAccessException、InvocationTargetException等反射异常 - 示例方法:
public static <t> T createInstance(String className, Class<t> expectedType) throws Exception { Class> clz = Class.forName(className); Object obj = clz.getDeclaredConstructor().newInstance(); if (!expectedType.isInstance(obj)) { throw new ClassCastException("Expected " + expectedType + ", got " + obj.getClass()); } return expectedType.cast(obj); }</t></t>
进阶:支持带参构造器的泛型工厂
若目标类无无参构造器,需动态传入参数类型与值:
- 方法签名可扩展为
<t> T create(Class<t> type, Class>[] paramTypes, Object... args)</t></t> - 通过
type.getConstructor(paramTypes).newInstance(args)调用指定构造器 - 常见于配置驱动场景:从 properties/yaml 读取类名和参数,自动装配对象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










