java中反射结合工厂模式动态加载实现类,核心是用反射替代硬编码new实例化,通过类名运行时加载创建对象,解耦接口与实现;定义paymentservice接口及alipayservice、wechatservice等实现类,工厂类paymentfactory利用class.forname和newinstance动态创建实例,并支持配置文件驱动和带参构造注入,提升扩展性与灵活性。

Java 中反射结合工厂模式动态加载实现类,核心是用反射替代硬编码的 new 实例化,让工厂在运行时根据类名(或配置)加载并创建具体实现对象。关键在于解耦接口与实现,提升扩展性。
定义统一接口,明确契约
先定义一个业务接口,所有实现类都遵循它:
public interface PaymentService {
void process(double amount);
}
不同支付方式实现该接口,例如:
public class AlipayService implements PaymentService {
public void process(double amount) {
System.out.println("支付宝支付:" + amount);
}
}
public class WechatService implements PaymentService {
public void process(double amount) {
System.out.println("微信支付:" + amount);
}
}
工厂类用反射动态创建实例
工厂不再用 if-else 或 switch 创建对象,而是接收全限定类名(如 "com.example.AlipayService"),通过反射加载并实例化:
public class PaymentFactory {
public static PaymentService createPaymentService(String className) {
try {
Class> clazz = Class.forName(className);
// 检查是否实现了 PaymentService 接口
if (!PaymentService.class.isAssignableFrom(clazz)) {
throw new IllegalArgumentException(className + " 不是 PaymentService 的实现类");
}
return (PaymentService) clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException("创建支付服务失败:" + className, e);
}
}
}
使用示例:
PaymentService service = PaymentFactory.createPaymentService("com.example.WechatService");
service.process(99.9); // 输出:微信支付:99.9
配合配置文件或外部输入提升灵活性
把类名从硬编码移到配置中,比如 application.properties:
payment.impl=com.example.AlipayService
启动时读取并初始化:
String implClass = PropertiesUtil.getProperty("payment.impl");
PaymentService service = PaymentFactory.createPaymentService(implClass);
这样新增支付方式只需添加实现类 + 修改配置,无需改工厂代码。
进阶:支持带参构造或依赖注入
若实现类构造器需要参数(如数据库连接、配置对象),可扩展工厂方法:
- 用
getDeclaredConstructor(Class...)指定参数类型 - 传入对应实参调用
newInstance(Object...) - 或结合 Spring 的
ApplicationContext.getBean()替代手写反射,更安全可控
例如:
public static PaymentService createWithConfig(String className, Config config) {
try {
Class extends PaymentService> clazz = (Class extends PaymentService>) Class.forName(className);
Constructor extends PaymentService> ctor = clazz.getDeclaredConstructor(Config.class);
return ctor.newInstance(config);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
反射+工厂的组合让系统具备“热插拔”能力,适合插件化、多租户或策略频繁变更的场景。注意做好异常处理、类校验和类加载隔离,避免 ClassNotFoundException 或类型转换错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











