静态代理:
- 在编译阶段就已经确定代理类和真实对象的关系。
- 代理类需要手动编写或生成,为每个真实对象单独创建一个代理类。
- 在代理类中可以添加额外的逻辑,如校验、日志等,增强功能。
- 维护需对代理类和真实对象的修改,增加代码维护成本。
- 在代理类和真实对象之间存在静态关联。
动态代理:
- 在运行时通过反射机制动态生成代理类,无需手动编写代理类。
- 代理类通过实现 InvocationHandler 接口,并重写 invoke 方法来实现对真实对象的代理逻辑。
- 可以代理任意对象,无需为每个真实对象创建单独的代理类。
- 在调用代理对象的方法时,会动态调用 invoke 方法,可以在此方法中添加额外的逻辑。
- 可以实现动态添加、删除、替换代理逻辑,较为灵活。
区别
静态代理适合于需要对真实对象进行固定的增强逻辑,而动态代理适用于需要在运行时动态决定增强逻辑的场景。动态代理可以通过 Java 提供的 Proxy 类和相关接口(如 InvocationHandler)来实现,或者使用第三方库(如 CGLIB、Byte Buddy)来生成代理类。
需要注意的是,动态代理的实现相对较复杂,运行时生成代理类需要一定的性能开销。因此,在一些性能敏感的场景下,可能需要谨慎选择使用动态代理。
标签:真实,逻辑,动态,静态,代理,对象,随笔 From: https://www.cnblogs.com/Joseph-Jonardo/p/17637563.html