Java Proxy动态代理

常见使用场景(Spring AOP)

简单例子

包结构

Java Proxy动态代理

User类

Java Proxy动态代理

UserService接口

Java Proxy动态代理

UserService接口实现类

Java Proxy动态代理

我的动态代理类(实现InvocationHandler接口)
Java Proxy动态代理

测试使用动态代理的类

Java Proxy动态代理

测试我的动态代理运行结果
Java Proxy动态代理
解释
我们的动态代理类实现了InvocationHandler接口

重写invoke方法
Java Proxy动态代理
使用示范
Java Proxy动态代理


在原有接口方法被调用方法执行的基础之上,在执行原有方法前加入了beforeSave()方法(自己写的),
在执行之后调用了finishSave()方法,在调用原来接口中方法的基础之上调用了其他方法,实现我们所需的功能,

比如计算该方法执行所需时间可以在方法前后获取时间计算差值、日志记录
避免了使用代码去入侵原来封装好的对象,实现了我们要做的事情并且没有污染模块的源码

关键代码解释:
 

UserService proxy=(UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),new Class[]{UserService.class},userServiceProxy);

调用Proxy的newProxyInstance实例化一个新的动态代理对象

参数解释
userService.getClass().getClassLoader() 被代理对象的classLoader
new Class[]{UserService.class}被代理的所有方法的接口数组(UserService是一个接口)
userServiceProxy我的动态代理(实现了InvocationHandler接口)