Java之静态代理 StaticProxy 了解静态代理下面附上一段简单代码先大致了解一下静态代理// 统一接口 interface NBA { void personalAction(); } // 真实业务类只负责业务本身 class Kobe implements NBA { Override public void personalAction() { System.out.println(湖人总冠军); } } // 静态代理类 class KobeProxy implements NBA { // 组合持有真实对象不是继承 private NBA target; public KobeProxy(NBA target) { this.target target; } Override public void personalAction() { // 增强逻辑 System.out.print(权限拦截); // 调用真实业务方法 target.personalAction(); System.out.println(耗时统计); } }在系统开发时需要将业务代码与增强代码分隔开来业务代码只负责业务本身而调用业务代码前后所需的身份校验、日志记录、异常捕获等放在调用业务代码前后由此引出静态代理为何代理类和被代理类要实现同一个接口在企业项目开发中具体所需业务都被封装为接口通过接口可以统一管理实现类。如NBA新增playBall()方法那么实现接口的Kobe类被代理类以及KobeProxy静态代理类都能及时跟进业务修改防止遗漏报错。静态代理的局限性1、类爆炸每一个业务实现类都要手写专属代理类2、增强逻辑大量重复复用性极差。多个代理类里的通用逻辑日志打印、耗时统计、异常捕获代码完全一模一样每个 Proxy 都要复制粘贴一份 如果要修改通用增强逻辑必须修改全部代理类漏改一个就会出现逻辑不一致。3、接口一旦新增 / 修改方法所有代理类必须同步修改。4、静态代理类是编译前手写死的如果你程序运行时才动态确定要代理哪个类比如根据用户输入选择球星静态代理无法提前写好对应 Proxy无法灵活适配。总结静态代理第一次实现业务代码与横切增强代码彻底解耦是动态代理、AOP 所有框架的理论基石没有静态代理就没有后来的动态代理。由此引出代理模式的终极方案--动态代理。以上均为个人见解如有不足欢迎讨论。