java--动态代理学习笔记
2021/7/14 17:05:22
本文主要是介绍java--动态代理学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
动态代理学习笔记
- 什么是代理设计模式?
- 为什么使用动态代理?
- 练习Demo
- interface UserService
- class UserServiceImpl
- class ProxyInvocationHandler
- 调用
什么是代理设计模式?
分为静态代理和动态代理。将原有业务代码不变更作为原则,通过代理类来实现对原有业务的功能扩展。
为什么使用动态代理?
使用动态代理解决静态代理需要手写多个代理类应对不同业务的情况
练习Demo
interface UserService
package ProxyDemo; public interface UserService { void add(); void delete(); void update(); void query(); }
class UserServiceImpl
package ProxyDemo; /** * @Description: 接口实现类 * @author: HardyDragon * @date: 2021年07月14日 16:31 */ public class UserServiceImpl implements UserService { @Override public void add() { System.out.println("add succ"); } @Override public void delete() { System.out.println("delete succ"); } @Override public void update() { System.out.println("update succ"); } @Override public void query() { System.out.println("query succ"); } }
class ProxyInvocationHandler
利用 Proxy类生成代理实例,传入
loader – 定义代理类的类加载器(反射有关知识点)
接口 - 代理类要实现的接口列表
h – 将方法调用分派到的调用处理程序
返回:
具有代理类的指定调用处理程序的代理实例,该代理类由指定的类加载器定义并实现指定的接口
package ProxyDemo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @Description: 利用 Proxy 和 实现 InvocationHandler 接口重写 invoke 方法,实现设置生成动态代理类 * @author: HardyDragon * @date: 2021年07月14日 16:22 */ public class ProxyInvocationHandler implements InvocationHandler { // 要被代理的接口 private Object target; // 设置要被代理的接口 public void setTarget(Object target) { this.target = target; } // 获取生成的动态代理类 public Object getProxy() { return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } // 处理代理实例 额外操作 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log(method.getName()); Object res = method.invoke(target, args); return res; } // 通过代理类添加额外的业务 public void log(String msg) { System.out.println("[Debug]执行了" + msg + "方法!"); } }
调用
package ProxyDemo; /** * @Description: 使用动态代理解决静态代理 需要手写多个代理类应对不同业务的情况 * @author: HardyDragon * @date: 2021年07月14日 16:30 */ public class Client { public static void main(String[] args) { // 真实对象,要被代理的对象,纯粹的业务 UserServiceImpl userService = new UserServiceImpl(); // 动态生成的代理类 ProxyInvocationHandler pih = new ProxyInvocationHandler(); // 给代理类设置要代理的对象 pih.setTarget(userService); // 得到生成的代理类 UserService proxy = (UserService) pih.getProxy(); proxy.add(); proxy.delete(); proxy.update(); proxy.query(); } }
result
[Debug]执行了add方法! add succ [Debug]执行了delete方法! delete succ [Debug]执行了update方法! update succ [Debug]执行了query方法! query succ Process finished with exit code 0
这篇关于java--动态代理学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-17HarmonyOS NEXT开发实战:打造高效上拉刷新与下拉加载组件(一)空页面的设计与实现
- 2024-11-17职场毒瘤:无脑尊蠢老!我不反对尊老,我只是反对没有脑子的尊老!
- 2024-11-17顶级企业如何用数据脱敏保护用户隐私!
- 2024-11-16ShardingSphere 如何完美驾驭分布式事务与 XA 协议?
- 2024-11-16ShardingSphere如何轻松驾驭Seata柔性分布式事务?
- 2024-11-16Maven资料入门指南
- 2024-11-16Maven资料入门教程
- 2024-11-16MyBatis Plus资料:新手入门教程与实践指南
- 2024-11-16MyBatis-Plus资料入门教程:快速上手指南
- 2024-11-16Mybatis资料入门教程:新手必看指南