《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
随机推荐
- mysql 多个字段的查询处理
https://blog.csdn.net/zzzgd_666/article/details/81101548
- a++与++a,谈谈C++的参数传递
先看一段代码: #include<iostream> using namespace std; void func(int a, int b) { cout << a < ...
- Linux 生成随机mac地址,并固化到本地
前言: 将Mac地址随机化并固化到本地可以有效避免同一个网络内,mac地址冲突导致的网络阻塞问题. 以下是有关的方法: 1.使用$RANDOM和md5sum(嵌入式无需移植其他软件的优秀可选方案) M ...
- stone2 [期望]
也许更好的阅读体验 \(\mathcal{Description}\) 有 \(n\) 堆石子,依次编号为 \(1, 2,\ldots , n\),其中第 \(i\) 堆有 \(a_i\) 颗石子 你 ...
- Scala 系列(三)—— 流程控制语句
一.条件表达式if Scala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的. object ScalaApp extends App ...
- 全栈项目|小书架|微信小程序-登录回调及获取点赞列表功能
效果图 这一节介绍,登录回调 以及 喜欢列表 的实现. 登录回调:这里是指在获取登录完成之后,再进行下一步的操作. 比如效果图中我的页面,默认是未登录状态,积分和喜欢列表的数量都没有获取到. 而登录成 ...
- Ambari深入学习(I)-系统架构
Ambari是hadoop分布式集群配置管理工具,是由hortonworks主导的开源项目.它已经成为apache基金会的孵化器项目,已经成为hadoop运维系统中的得力助手,引起了业界和学术界的关注 ...
- 介绍ArcGIS中各种数据的打开方法——mdb(个人数据库)
3.打开存储在Access GeoDatabase的要素类 使用工作空间打开一个Access库中的一个要素类. private void OpenWorkspaceFromFileAccess(str ...
- MVC学习笔记(一)—用EF创建数据库
1.新建MVC项目 2.在Models文件夹下添加名为User的新类 2.1 Users类中的代码为: public class Users { /// <summary> / ...
- MVC视图中 TextBoxFor 数据格式化
@Html.TextBoxFor(m => m.Birthday,"{0:yyyy-MM-dd}", new { @class = "m-wrap small&qu ...