当前位置: 首页 > news >正文

Java 动态代理实现

Java 动态代理实现

  • 一、JDK动态代理
  • 二、CGLIB动态代理
  • 三、动态代理的应用场景
  • 四、JDK代理与CGLIB代理比较

动态代理是Java中一种强大的技术,它允许在运行时创建代理对象,用于拦截对目标对象的方法调用。

一、JDK动态代理

JDK动态代理是Java标准库提供的代理实现,基于接口。

  1. 定义接口
interface UserService {void addUser(String name);
}
  1. 实现接口
class UserServiceImpl implements UserService {@Overridepublic void addUser(String name) {System.out.println("添加用户" + name);}
}
  1. 实现InvocationHandler
class UserServiceInvocationHandler implements InvocationHandler {private Object target;public UserServiceInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("--- 前置处理 ---");Object result = method.invoke(target, args);System.out.println("--- 后置处理 ---");return result;}
}
  1. 创建代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class JdkProxyDemo {public static void main(String[] args) {UserService userService = new UserServiceImpl();UserServiceInvocationHandler invocationHandler = new UserServiceInvocationHandler(userService);UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(), invocationHandler);proxy.addUser("张三");}
}

jdk

二、CGLIB动态代理

当目标类没有实现接口时,可以使用CGLIB库实现动态代理。

  1. 添加CGLIB依赖(Maven)
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
  1. 目标类(不需要实现接口)
class ProductService {public void addProduct(String name) {System.out.println("添加产品: " + name);}
}
  1. 方法拦截器
class ProductMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("--- 前置处理 ---");// 调用父类方法Object result = proxy.invokeSuper(obj, args);System.out.println("--- 后置处理 ---");return result;}
}
  1. 创建代理
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;public class CglibProxyDemo {public static void main(String[] args) {ProductMethodInterceptor interceptor = new ProductMethodInterceptor();Enhancer enhancer = new Enhancer();enhancer.setSuperclass(ProductService.class);enhancer.setCallback(interceptor);ProductService proxy = (ProductService) enhancer.create();proxy.addProduct("手机");}
}

cglib

三、动态代理的应用场景

  1. AOP编程:如Spring的AOP功能
  2. 远程方法调用:如RPC框架
  3. 事务管理
  4. 日志记录
  5. 权限控制
  6. 性能监控

四、JDK代理与CGLIB代理比较

特性JDK动态代理CGLIB动态代理
基于接口
性能创建快,运行慢创建慢,运行快
限制只能代理接口不能代理final类和方法
依赖Java内置需要第三方库
实现原理反射字节码生成

在Spring框架中,如果目标对象实现了接口,默认使用JDK动态代理,否则使用CGLIB代理。

http://www.xdnf.cn/news/33859.html

相关文章:

  • Python scikit-learn 机器学习算法实践
  • 【每天一个知识点】模式识别
  • MySQL进阶-存储过程-变量语法结构
  • C++用于保留浮点数的两位小数,使用宏定义方法(可兼容低版本Visual Studio)
  • JZ8P1533 充电型数字可编程控制器
  • 200+短剧出海平台:谁能成为“海外红果”?
  • 电脑端移植至手机平板:攻克难题,仙盟架构显神通——仙盟创梦IDE
  • 2025.04.19-阿里淘天春招算法岗笔试-第二题
  • 在RK3588上使用SRS流媒体服务器
  • kafka集群认证
  • NumPy 核心指南:零基础入门与实践
  • 商标起名换了暗示词,通过初审!
  • 边生成边训练:构建合成数据驱动的在线训练系统设计实战
  • XMind 下载指南
  • 基于autoware.1.14与gazebo联合仿真进行全局规划高精地图版
  • 可穿戴经颅多通道直流电刺激产品测试总结
  • 16、堆基础知识点和priority_queue的模拟实现
  • 为什么 waitress 不支持 WebSocket?
  • PyTorch源码编译报错“fatal error: numpy/arrayobject.h: No such file or directory”
  • SEO长尾关键词优化实战
  • velocity模板引擎
  • 【一起学Rust】使用Thunk工具链实现Rust应用对Windows XP/7的兼容性适配实战
  • RoBoflow数据集的介绍
  • JVM笔记【一】java和Tomcat类加载机制
  • PHP怎样连接MySQL数据库?
  • 基于STM32中断讲解
  • 【JDBC-54.5】JDBC批处理插入数据:大幅提升数据库操作性能
  • YOLO拓展-NMS算法
  • GWAS_LD
  • TCP 总是禁用分片(IP_DF,Don‘t Fragment)吗?