动态代理

  • 1.介绍
  • 2.案例

1.介绍

public interface Star {String sing(String name);void dance();
}public class BigStar implements Star{private String name;public BigStar(String name) {this.name = name;}public String sing(String name) {System.out.println(this.name + "正在唱:" + name);return "谢谢!谢谢!";}public void dance() {System.out.println(this.name + "正在跳舞");}
}
// 类似于中介公司
public class ProxyUtil {public static Star createProxy(BigStar bigStar) {//参数1:CLassLoader 用于指定一个类加载器//参数2:interfaces 指定生成的代理长什么样,也就是有什么方法//参数3:InvocationHandler 指定生成的代理对象要干什么事情Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理对象要做的事情,会在这里写代码if (method.getName().equals("sing")) {System.out.println("代理准备话筒,收钱20万");} else if (method.getName().equals("dance")) {System.out.println("代理准备场地,收钱20万");}return method.invoke(bigStar, args);}});return starProxy;}
}
// 测试类
public class Test {public static void main(String[] args) {BigStar s = new BigStar("杨超越");Star starProxy = ProxyUtil.createProxy(s);String rs = starProxy.sing("好日子");System.out.println("rs = " + rs);starProxy.dance();}
}

2.案例

案例:使用代理优化用户管理类
场景:某系统有一个用户管理类,包含登录,删除用户,查询用户等功能,系统要求统计每个功能的执行耗时情况,以便后期观察程序性能
需求:现在已经开发好了该模块,找出目前存在的问题,并对其进行改造

/*** 用户业务接口*/
public interface UserService {// 登录功能void login(String loginName,String passWord) throws Exception;// 删除用户void deleteUser() throws Exception;// 查询用户,返回数组的形式String[] selectUsers() throws Exception;
}public class UserServiceImpl implements UserService{@Overridepublic void login(String loginName, String passWord) throws Exception {long startTime = System.currentTimeMillis();if ("admin".equals(loginName) && "123456".equals(passWord)) {System.out.println("登录成功");} else {System.out.println("登录失败");}Thread.sleep(1000);long endTime = System.currentTimeMillis();System.out.println("login方法执行耗时:" + (endTime - startTime)/1000.0 + "s");}@Overridepublic void deleteUser() throws Exception{long startTime = System.currentTimeMillis();System.out.println("成功删除1万个用户");Thread.sleep(1500);long endTime = System.currentTimeMillis();System.out.println("deleteUser方法执行耗时:" + (endTime - startTime)/1000.0 + "s");}@Overridepublic String[] selectUsers() throws Exception{long startTime = System.currentTimeMillis();System.out.println("查询出3个用户");String[] names = {"张三", "李四", "王五"};long endTime = System.currentTimeMillis();System.out.println("deleteUser方法执行耗时:" + (endTime - startTime)/1000.0 + "s");return names;}
}

存在的问题:主要业务逻辑不应该包含时间相关的代码
解决办法:将时间相关的代码通过代理模式实现,把业务类的相关代码删除

public class UserServiceProxy {public static UserService createProxy(UserService userService) {UserService userServiceProxy = (UserService) Proxy.newProxyInstance(UserServiceProxy.class.getClassLoader(),new Class[]{UserService.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("login") || method.getName().equals("deleteUser") ||method.getName().equals("selectUsers")) {long startTime = System.currentTimeMillis();Object rs = method.invoke(userService, args);long endTime = System.currentTimeMillis();System.out.println(method.getName() + "方法执行耗时:" + (endTime - startTime)/1000.0 + "s");return rs;} else {Object rs = method.invoke(userService, args);return rs;}}});return userServiceProxy;}
}

Java高级-动态代理相关推荐

  1. 设计模式总结——代理模式以及java的动态代理

    定义 给目标对象一个代理对象,并由代理对象控制对目标对象的引用.联想到生活中就像是海外代购 既然是代理,就说明他要做的事情要比你直接去做要做的多,这就联系到了方法的增强,也就联系到了AOP,面向切面. ...

  2. java的动态代理机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1.java的动态代理机制详解 转载于:https://my.oschina.net/Howard2016/blog ...

  3. 代理模式及Java实现动态代理

    代理模式 定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象. 代理模式UML图 在上图中: RealSubject 是原对象 ...

  4. 看完Java的动态代理技术——Pythoner笑了

    Java的动态代理常用来包装原始方法调用,用于增强或改写现有方法的逻辑,它在Java技术领域被广为使用,在阿里的Sofa RPC框架序列化中你能看到它的身影,Hibernate的实体类功能增强也是以动 ...

  5. 深入理解Java反射+动态代理,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起在群里探讨技术. 答: ...

  6. Java特性-动态代理

    代理在开发中无处不在: 我们完成一个接口开发A,接口下有很多个实现类,这些类有些共同要处理的部分,比如每一个类都定义了接口A中的方法getXX(String name).我现在想把每次调用某个实现类的 ...

  7. java CGLIB动态代理

    CGLIB动态代理 一:CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成.CGLIB通过继承方式实现代理. 二: ...

  8. Java高级 正向代理和反向代理理解

    文章目录 Java高级 正向代理和反向代理理解(小白必看 最好懂的教程) 1)概要 2)什么是代理 1.介绍代理 2.C-S架构 3)区分正向代理和反向代理 4)正向代理怎么理解 1.生活场景 2.互 ...

  9. Java - JDK动态代理原理

    Java - JDK动态代理原理 前言 一. JDK动态代理源码分析 1.1 生成目标代理类 getProxyClass0 1.1.1 KeyFactory 生成接口的虚引用 1.1.2 ProxyC ...

  10. [Java|面试] 面试被问Java的动态代理机制,能说说吗

    Java的动态代理机制 文章目录 Java的动态代理机制 0. 什么是代理 1.动态代理和静态代理的区别 2. 使用代理的情况 3. 动态代理的构成 4. JDK中的动态代理 5. 手写一个JDK动态 ...

最新文章

  1. linux 和windows 下golang安装
  2. LA3971组装电脑
  3. javascript中关于作用域和闭包
  4. 3.3 matlab用switch语句实现选择结构
  5. javascript入门 - 1
  6. 用linux集成电路版图设计,集成电路版图设计教程2012版本
  7. 摇杆控制方向原理_图文全面讲解多种方向控制阀的原理和区别....
  8. oracle sql优化指导,基于Oracle的sql优化(1)
  9. Debian Chroot on Synology NAS
  10. 20200317_利用神经网络预测贷款率
  11. 一键环境安装包无法修改网站目录提示.user.ini权限问题解决方法
  12. matlab如何更改程序中所有同名_MATLAB作图实例:52:添加网格线并编辑位置
  13. Office Open XML 文档格式(转)
  14. Android音视频——H265编码核心技术解析
  15. 基于springboot旅游系统
  16. python修改屏幕分辨率_python调win32api调整屏幕分辨率
  17. Android5.1.1-高通msm8916平台添加Etehrnet。(驱动+上层framworks)
  18. 快速转换:将音乐文件转换为MP3格式的步骤
  19. WebRTC--添加IOCP网络模型支持
  20. 谈谈科学与宗教的关系

热门文章

  1. 三大运营商6月新增3G用户均大增,上半年联通新增最多
  2. laravel mews/captcha session 失效
  3. 计算机在应用物理学中的应用情况,物理学在计算机中的应用.doc
  4. [算法系列之十二]字符串匹配之蛮力匹配
  5. TASK3-方差和偏差理论
  6. Word2Vec进阶 -GPT2
  7. Mac终端创建文件夹Permission denied问题
  8. 业余做自由职业,对国外客户如何收款?
  9. 生物麦克斯韦妖:生命如何利用信息产生秩序
  10. socketChatRoom_Server(聊天室服务端)