java程序设计开发,扎实的java编程基础-反射之反射与设计模式结合学习笔记,反射(Reflection)是 Java 在运行时动态获取类信息、创建对象、调用方法的能力。
Java 反射与设计模式结合学习笔记
一、反射在设计模式中的核心价值
反射(Reflection)是 Java 在运行时动态获取类信息、创建对象、调用方法的能力。与设计模式结合时,反射能:
- 增强动态性:无需硬编码类名,通过配置或注解动态加载类(如工厂模式、策略模式)。
- 实现通用逻辑:编写与具体类无关的代码(如代理模式、观察者模式)。
- 突破封装限制:访问私有成员(如单例模式中反射破坏封装的问题)。
二、反射与工厂模式(Factory Pattern)
场景:动态创建对象(解耦客户端与具体类)
传统工厂模式需为每个子类编写工厂方法,反射可实现 “通用工厂”,根据类名动态创建对象。
案例:通用对象工厂(支持配置文件)
- 定义产品接口:
interface Product { void use(); }
- 具体产品类:
class ConcreteProductA implements Product { @Override public void use() { System.out.println("使用ProductA"); } } class ConcreteProductB implements Product { @Override public void use() { System.out.println("使用ProductB"); } }
- 反射实现通用工厂:
import java.util.Properties; import java.lang.reflect.Constructor; public class ReflectiveFactory { private static final Properties CONFIG = new Properties(); static { try { CONFIG.load(ReflectiveFactory.class.getResourceAsStream("/config.properties")); } catch (Exception e) { throw new RuntimeException("加载配置失败", e); } } // 根据类型标识动态创建产品 public static Product createProduct(String type) throws Exception { String className = CONFIG.getProperty(type); Class<?> clazz = Class.forName(className); Constructor<?> constructor = clazz.getDeclaredConstructor(); return (Product) constructor.newInstance(); } }
- 配置文件(config.properties):
productA=com.example.ConcreteProductA productB=com.example.ConcreteProductB
- 客户端调用:
Product product = ReflectiveFactory.createProduct("productA"); product.use(); // 输出:使用ProductA
解析
- 反射作用:通过
Class.forName
和构造器反射,工厂无需知晓具体产品类,只需读取配置即可创建对象,符合开闭原则。 - 优势:新增产品时只需修改配置文件,无需修改工厂代码,解耦客户端与产品实现。
三、反射与单例模式(Singleton Pattern)
场景:反射破坏单例及防御
反射可通过调用私有构造器创建多个单例实例,需额外逻辑防御。