《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现
如题
- 代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
- 代理模式可细分为如下, 本文不做多余解释
- 远程代理
- 虚拟代理
- 缓冲代理
- 保护代理
借鉴文章
https://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
《Java设计模式》 -Java动态代理(InvocationHandler)
AbstractUserDAO 抽象的用户DAO类, 抽象主题角色
package proxy;/*** @description 抽象的用户DAO类, 抽象主题角色* @Date 2019/6/22 10:05*/
public interface AbstractUserDAO {Boolean findUserById(Long userId);
}
UserDAO 用户DAO类,具体主题角色
package proxy;/*** @description 类的详细说明: 用户DAO类,具体主题角色* @Date 2019/6/22 10:08*/
public class UserDAO implements AbstractUserDAO{/*** 简单举个栗子,实际应用时自行调整* @param userId* @return*/@Overridepublic Boolean findUserById(Long userId) {Long maxx =new Long( "10000000");if(userId>=1 && userId<=maxx){System.out.println("查询ID为 "+userId+" 的用户信息成功!");return true;}else{System.out.println("查询ID为 "+userId+" 的用户信息失败");return false;}}
}
DAOLogHandler 自定义请求处理程序, 前后打印日志
package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.GregorianCalendar;/*** @description 自定义请求处理程序,实现前置和后置通知, 及前后打印日志* @Date 2019/6/22 10:15*/
public class DAOLogHandler implements InvocationHandler {/**calendar 属性用于打印时间*/private Calendar calendar;private Object object;/*** 自定义有参构造器,用以注入一个需要提供代理的真实主题对象* @param object 代理对象*/public DAOLogHandler(Object object) {this.object = object;}/*** @param proxy 需要代理的类* @param method 需要代理的方法* @param args 代理方法的参数数组* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {beforeInvoke();/**转发调用*/Object result = method.invoke(object,args);afterInvoke();return result;}/*** 实现前置通知处理*/private void beforeInvoke(){//使用当前时间构造默认的<code>GregorianCalendar类</code> ,在默认时区, 使用默认值calendar = new GregorianCalendar();int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);System.out.println("------------调用时间 "+hour+":"+minute+":"+second+"------------");}/*** 实现后置通知处理*/private void afterInvoke(){calendar = new GregorianCalendar();int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);System.out.println("------------调用方法结束 "+hour+":"+minute+":"+second+"------------\n");}
}
Client 主要测试类
package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;/*** 客户端类, 主要测试类** 题目描述: 某公司要为公司的OA(办公自动化)系统的数据访问层DAO增加方法调用日志,* 记录每一个方法被调用的时间和调用结果,现使用动态代理(InvocationHandler)进行设计和实现.*/
public class Client {public static void main(String[] args) {InvocationHandler handler = null;AbstractUserDAO userDAO = new UserDAO();/**初始化调用处理器*/handler = new DAOLogHandler(userDAO);AbstractUserDAO proxy=null;//动态创建代理对象// Proxy.newProxyInstance : 返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。proxy = (AbstractUserDAO) Proxy.newProxyInstance(AbstractUserDAO.class.getClassLoader(),new Class[]{AbstractUserDAO.class},handler);proxy.findUserById((long)001);proxy.findUserById((long)999999999);}
}
测试输出
------------调用时间 10:59:25------------
查询ID为 1 的用户信息成功!
------------调用方法结束 10:59:25------------------------调用时间 10:59:25------------
查询ID为 999999999 的用户信息失败
------------调用方法结束 10:59:25------------
转载于:https://www.cnblogs.com/zhazhaacmer/p/11068254.html
《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现相关推荐
- Java篇 - 代理模式和动态代理实现原理
设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationTh ...
- Java内功修炼系列:代理模式及动态代理
目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...
- Java拾遗:007 - 代理模式与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...
- 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式
文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...
- 设计模式—代理模式以及动态代理的实现
代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.被代理的对象可以是远程对象.创建开销大的对象或需要安全控制的对象. 一 ...
- 代理模式和动态代理模式_代理模式介绍
代理模式和动态代理模式 代表:被选中或当选为他人投票或代理的人– Merriam-Webster . 委托模式:在软件工程中,委托模式是面向对象编程中的一种设计模式,其中,一个对象而不是执行其陈述的任 ...
- 代理模式、动态代理和面向方面
代理的意思很好理解,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事,由于某种原因不能直接做,而只能请人代替你做,这个被你请来做事的人就是代理.比如过春节要回家,由于你要上班,没时间去 ...
- 20171030_chr_proxy 代理模式(动态代理)
代理模式(动态代理) /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/Dog.java package nuc.sw.dynamic.proxy;public ...
- java动态代理_Java代理模式及动态代理详解
Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式 无 ...
- JAVA代理模式与动态代理模式
1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用. 代理模式给 ...
最新文章
- 您如何确定以编程方式发送的电子邮件不会自动标记为垃圾邮件?
- Python:zip()函数
- MySQL中的show full columns from 表名
- Java多线程的上下文切换
- C#中的线程(一)入门
- pycharm多行代码同时注释、去除注释
- 悟道web标准:前端性能优化
- CMD恶搞命令集,假装自己是黑客
- php鼠标指针,在windows中鼠标指针呈四箭头时一般表示什么
- DDR和LPDDR、LPDDR4和LPDDR4X的区别 LPDDR5
- 问题 F: 小明与隔壁老王之间不得不说的故事
- 网易设计师:交互设计要承担的8大工作职能
- 信号完整性(SI)电源完整性(PI)学习笔记(十七)传输线的串扰(一)
- SUNDIALS中的RTOL和ATOL
- linux下kbhit的头文件,linux下kbhit()使用
- LeetCode1219 黄金矿工
- 计算机软件工程专业,计算机软件工程专业
- 新iPhone9月登场, 5大特色浮出水!
- Windows笔记本移动热点打不开
- 从中医角度体检健身标准
热门文章
- 基于Redis的三种分布式爬虫策略
- JDRefresh 轻简下拉刷新框架
- Exchange 2016之用EMS配置全局OWA语言和时区设置
- apache编译出错 error: mod_deflate has been requested
- 如何优雅的调用第三方接口
- 程序员翻车时的 30 种常见反应!第21个深有感触...
- 史上最便捷搭建RocketMQ服务器的方法
- 牛逼!这么问 OutOfMemoryError 能让我懵逼!
- mnist数据集_探索Tensorflow2中神经网络算法——基于Mnist数据集(一)
- linux进阶之Tomcat服务篇