一、代理模式的基本介绍

1、代理模式的定义的好处,即特点

代理模式:为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象功能。

被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。

代理模式有三种不同的模式:

  1. 静态代理
  2. 动态代理(JDK代理、Cglib代理)

JDK代理:基于接口的代理。

              Cglib代理:可以在内存动态的创建对象,而不需要实现接口 

二、三种代理模式的流程分析

1、静态代理

(1)、定义和实现方式

静态代理:在使用时,需要定义接口或者父类,被代理对象和代理对象一起实现相同的接口或者继承相同的父类。

实现方式:

继承的方式:继承父类,对父类方法的重写。

聚合的方式:实现相同的接口,通过代理类的构造函数传入被代理对象,进行方法的调用。

(2)、聚合方式的实例调用

/******************接口方法的定义*******************///功能接口
public interface UserDao {public void login();
}/******************目标对象(被代理对象)方法的实现*******************/
//目标对象(被代理对象)
public class UserDaoImpl implements UserDao{@Overridepublic void login() {System.out.println("登录中....");}
}/******************代理对象的实现*******************///代理对象
public class UserDaoImplProxy implements UserDao{//维护一个目标对象,Objectprivate UserDaoImpl userDao;//构造器,对目标对象target初始化public UserDaoImplProxy(UserDaoImpl userDao) {this.userDao = userDao;}@Overridepublic void login() {System.out.println("代理开始....");userDao.login();System.out.println("代理结束");}
}/******************客户端的调用*******************/
public class UserTest {public static void main(String[] arg){//目标对象UserDaoImpl userDao = new UserDaoImpl();//创建代理对象,将目标对象传入代理对象中UserDaoImplProxy userDaoImplProxy = new UserDaoImplProxy(userDao);//代理对象方法的代用userDaoImplProxy.login();}
}

2、动态代理(基于JDK动态代理)

(1)、动态代理的基本介绍

  • 代理对象不需要实现接口,但是目标对象需要实现接口,否则不能用动态代理。
  • 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。
  • 动态代理也叫JDK代理、接口代理。

(2)、JDK中生成代理对象的API

代理类所在的包:java.lang.reflect.Proxy.

jdk实现代理只需要使用newProxyInstance方法 ,该方法需要接受三个参数,完整的写法如下:

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

(3)、实例流程

流程调用流程图

核心代码调用

/*****************功能接口的定义******************/
public interface ITeacherDao {public void teach();
}/*****************被代理对象(目标对象)的创建******************/
//被代理对象(目标对象)
public class TeacherDao implements ITeacherDao{public void teach() {System.out.println("老师授课中");}
}/*****************创建代理工厂******************///代理工厂
public class ProxyFactory {//维护一个目标对象,Objectprivate Object target;//构造器,对目标对象target初始化public ProxyFactory(Object target) {this.target = target;}//给目标对象生成一个代理对象public Object getProxyInstance() {/***  public static Object newProxyInstance(ClassLoader loader,*  Class<?>[] interfaces,*  InvocationHandler h)**  1、ClassLoader loader:指定当前目标对象使用的类加载器,*  2、Class<?>[] interfaces:目标对象实现的接口类型,使用泛型的方法确认类型*  3、InvocationHandler h:事件处理,执行目标对象方法时,会触发事件处理方法,会把当前执行的目标对象方法作为参数传入***/return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK代理开始...");//反射机制调用目标对象的方法Object invoke = method.invoke(target, args);System.out.println("代理结束...");return invoke;}});}/*****************客户端的调用******************/
public class Client {public static void main(String[] arg){//创建目标对象ITeacherDao teacherDao = new TeacherDao();//给目标对象创建一个代理对象ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(teacherDao).getProxyInstance();proxyInstance.teach();}
}

3、动态代理(基于Cglib动态代理)

(1)、Cglib动态代理的基本介绍

静态代理和JDK的动态代理都要去目标对象实现接口,但是有时候目标对象只是单独的对象,并没有实现任何接口,这个时候可以使用目标对象来实现代理,这就是Cglib代理。

原理:

Cglib包的底层是通过使用字节码处理框架ASM来转化字节码,并生成新的类。

(2)、Cglib动态代理的特性

  • Cglib动态代理也叫做子类代理,他是在内存中构建一个子类对象,从而实现对目标对象功能的扩展,
  • Cglib是一个强大的高性能的代码生成包,它可以在运行期间扩展Java类与实现Java接口。

(3)、在Aop编程中如何选择代理模式

  • 目标对象需要实现接口,用JDK代理。
  • 目标对象不需要实现接口,用Cglib代理。

(4)、具体实例实现

实现类关系图

引入cglib相关jar包

<!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>

具体代码实现

/********************创建需要被代理的对象**************************
//需要被代理的目标对象
public class TeacherDao {public void teach() {System.out.println("老师授课中,我是cglib代理,不需要实现接口....");}
}/********************创建代理工厂(实现MethodInterceptor接口)**************************
public class ProxyFactory implements MethodInterceptor{//维护一个目标对象private Object target;//构造器,传入一个被代理的对象public ProxyFactory(Object target) {this.target = target;}//返回一个代理对象,是target对象的代理对象public Object getProxyInstance() {//1、创建一个工具类Enhancer enhancer = new Enhancer();//2、设置父类enhancer.setSuperclass(target.getClass());//3、设置回调函数enhancer.setCallback(this);//4、创建子类对象,即代理对象return enhancer.create();}//重写intercept方法,会调用目标对象方法public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("cglib代理模式开始");Object invoke = method.invoke(target, objects);System.out.println("代理模式结束 ");return invoke;}
}/***********************客户端的调用***********************
public class Client {public static void main(String[] arg){//创建目标对象TeacherDao teacherDao = new TeacherDao();//获取到代理对象,并将目标对象传递给代理对象TeacherDao proxyInstance = (TeacherDao) new ProxyFactory(teacherDao).getProxyInstance();//执行代理对象的方法,触发intercept方法,从而实现 对目标对象的调用proxyInstance.teach();}
}

Java代理模式分析相关推荐

  1. Android代理模式(静态代理,动态代理,Retrofit代理模式分析)

    文章目录 代理模式 前言:AOP编程(面向切面编程) 一. 代理思想 1. 静态代理 2. 动态代理 3. 动态代理的实现 二. Retrofit代理模式分析 代理模式 前言:AOP编程(面向切面编程 ...

  2. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  3. 关于IBM Lotus的JAVA代理进入jar包的说明

    有2种方法,一般用第一种: 方法1: 在JAVA代理里引入JAR包: import javax.rmi.*; //(就是这样引入) public class JavaAgent extends Age ...

  4. 通过 Lotus Domino Java 代理消费 Web 服务

    Web 服务是一种允许两台或更多的计算机在网络中交互的系统设计.这种服务的主要优点是,它是在多台不同操作系统的计算机和应用服务器之间发送对象的标准解决方法.例如,我们的公司使用 Web 服务从一台运行 ...

  5. java编写代理服务器_如何编写Java代理

    java编写代理服务器 对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问. 这是我们学习的实现此类代理的经验教训. 开始 使用"静态公共静态无效值pre ...

  6. java代理模式_Java代理

    java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...

  7. Java代理初学者指南

    尽管Java初学者很快学会了键入public static void main来运行他们的应用程序,但是即使是经验丰富的开发人员也常常不知道JVM对Java流程的两个附加入口点的支持: premain ...

  8. 如何编写Java代理

    对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问. 这是我们学习的实现此类代理的经验教训. 开始 使用" static public static vo ...

  9. java代理通俗简单解析

    1         代理 1.1            代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...

最新文章

  1. 文本类控件(EditView 的介绍)
  2. oracle erp 财务入门,Oracle ERP EBS 顾问财务模块基本业务操作专题
  3. Linux 的文件和目录管理类命令
  4. 在Qt中用默认程序打开文件
  5. php对手时间戳判断,PHP 中判断一个数字是否是Unix 时间戳
  6. 误删50节点K8s集群为何3小时才能复原?Spotify揭自家事故幕后经验
  7. argb可以和rgb同步吗_乔思伯推出CPU及M.2散热器:均支持ARGB神光同步
  8. BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线
  9. PyTorch 1.0 中文文档:序列化的相关语义
  10. 3dmax java_Java3D读取3DMax模型并实现鼠标拖拽、旋转、滚轮缩放等功能
  11. php windowcrlf和unix,文件格式unix与dos转换,CRLF与LF的区别查看
  12. mfc-PlaySound
  13. CentOS操作系统中安装JDK的完整步骤
  14. 全站仪坐标计算机公式,全站仪使用方法及坐标计算,详细讲解!建议收藏!
  15. 揭秘:带你玩转陪玩圈,潮流玩法轻松赚钱
  16. 一种Android应用耗电定位方案
  17. SteamOS—定制个人版的游戏主机
  18. python openpyxl操作Excel表格
  19. python复利计算_python复利代码
  20. python定义字符串_Python定义字符串、循环

热门文章

  1. 一对数的和等于给定的数
  2. 正则表达式(二)常用正则表达式——验证邮箱
  3. java项目-第161期ssm弹幕视频网站系统_ssm毕业设计_计算机毕业设计
  4. The VPN client agent was unable to create the interprocess communication depot.关于win10安装vpn报错的问题
  5. randn与rand的区别
  6. Java Swing(二)按钮点击事件处理ActionListener
  7. element UI dialog点击dialog区域外会关闭dialog
  8. Excel将其他单元格的数据合并成一个单元格
  9. 从最简单的ROE和PB的角度去选股
  10. 卷积层的主要作用_对卷积神经网络CNN的理解,一文读懂卷积神经网络。