《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
*/
@Override
public 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
*/
@Override
public 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------------
《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现的更多相关文章
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- (转)轻松学,Java 中的代理模式及动态代理
背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...
- JAVA代理模式与动态代理模式
1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某 ...
- 动态代理模式——JDK动态代理
今天,我就来讲一下动态代理的设计模式. 动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.操作动态代理需要两个步骤:一.代理对象和真实对象建立代理关系.二.实现代理对象的代理 ...
- Java的三种代理模式(Spring动态代理对象)
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- java代理模式及动态代理类
1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...
- Java代理模式之动态代理
动态代理类的源码是程序在运行期间由JVM根据反射等机制动态生成的,所以不存在代理类的字节码文件.代理角色和真实角色的联系在程序运行时确定! Java中有两种动态代理,一种是JDK自带的,另一种的CGL ...
- 代理模式-jdk动态代理
IDB package com.bjpowernode.proxy; /** * 代理类和目标类都必须使用同一个接口. */ public interface IDB { int insert(); ...
- 代理模式与动态代理之JDK实现和CGlib实现
静态代理 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 由业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理, ...
- Java 中的代理模式及动态代理
原文:https://blog.csdn.net/briblue/article/details/73928350
随机推荐
- 【MongoDB学习之六】MongoDB集群
环境 MongoDB 4.0 CentOS 6.5_x64 一.主从复制-Master-Slave这种模式已不再推荐使用了. 二.副本集-Replica Set(用的多)副本集其实一种互为主从的关系, ...
- 【maven学习】pom.xml文件详解
环境 apache-maven-3.6.1 jdk 1.8 eclipse 4.7 POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示, ...
- c++中共享内存原理及实现
共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用 , ...
- [转帖]Masscan教程和入门手册
Masscan教程和入门手册 https://www.4hou.com/tools/8251.html 愣娃 安全工具 2017年11月1日发布 收藏 导语:masscan是为了尽可能快地扫描整个互联 ...
- Appium移动端测试--基础预热
目录 Android自动化环境准备 需要安装的软件: Appium多端架构与自动化 Android自动化前提依赖: 获取App的信息: Android常用命令 adb shell 常用命令列表: An ...
- Django框架(十一)--cookie和session
cookie和session组件 cookie 1.cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它 ...
- golang 之 context包
概述 context是Go中广泛使用的程序包,由Google官方开发,在1.7版本引入.它用来简化在多个go routine传递上下文数据.(手动/超时)中止routine树等操作,比如,官方 ...
- Equalizing Two Strings CodeForces - 1256F (思维)
大意: 给定两个串$s,t$, 每次操作任选长度$len$, 分别翻转$s,t$中一个长$len$的子串, 可以进行任意次操作, 求判断能否使$s$和$t$相同. 字符出现次数不一样显然无解, 否则若 ...
- Java File类 mkdir 不能创建多层目录
File f = new File("/home/jp/Upload"); if ((!f.exists()) || (!f.isDirectory())) {boolean re ...
- That IP address can't be assigned to.的问题
That IP address can't be assigned to. 烦恼了很久,现在知道了,解决的办法如下 首先确定端口号是不是开放,阿里云的直接在控制台修改 其次 看看 你的地址是不是输入错 ...