《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
随机推荐
- Oracle 拆分列为多行 Splitting string into multiple rows in Oracle
=========================== The table is as follows: Name | Project | Error 108 test Err1, Err2, Err ...
- QT+FFMPEG+SDL2.0实现视频播放
开发环境:MinGW+QT5.9+FFMPEG20190212+SDL2.0.9 一.开发环境搭建 (1)下载工具 在https://ffmpeg.zeranoe.com/builds/下载对应版本. ...
- Django-08-admin
1. 介绍 admin是django强大功能之一,它能共从数据库中读取数据,呈现在页面中,进行管理.默认情况下,它的功能已经非常强大,如果你不需要复杂的功能,它已经够用,但是有时候,一些特殊的功能还需 ...
- python3 安装 pyinstaller 时报错的解决办法
如上图所示,在安装的过程中发现是所关联的一个 future模块安装失败,庵后我有单独安装了一下这个future,发现还是失败 然后在网上寻找解决办法,最后找到了这个指令,pip install fut ...
- 在local模式下的spark程序打包到集群上运行
一.前期准备 前期的环境准备,在Linux系统下要有Hadoop系统,spark伪分布式或者分布式,具体的教程可以查阅我的这两篇博客: Hadoop2.0伪分布式平台环境搭建 Spark2.4.0伪分 ...
- gin-swagger生成API文档
github地址:https://github.com/swaggo/gin-swagger 下载安装cmd/swag命令工具包 先下载cmd包,才能执行相关命令 go get -u github.c ...
- C#开启和关闭UAC功能
在制作软件安装包的时候,可以使用这个功能,关闭用户电脑UAC. 实现比较简单, 找到注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr ...
- java之hibernate之加载策略和抓取策略
1.加载策略:指hibernate查询数据时,采用什么样的方式将数据写入内存.Hibernate中提供了两种方式来加载数据:懒加载和即时加载. 2.懒加载又称延迟加载,指使用hiberante API ...
- jQuery中的几个案例:隔行变色、复选框全选和全不选
1 表格隔行变色 1 技术分析: 1 )基本过滤选择器: odd: even: 2 )jq添加和移除样式: addClass(); removeClass(); 2 代码实现 <script s ...
- Java自学-数组 排序
Java 数组选择法,冒泡法排序 步骤 1 : 选择法排序 选择法排序的思路: 把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来 比较完后,第一位就是最小的 然后再从第二位和剩余的其 ...