java代理模式实现
java代理模式实现
@(代理模式)[静态代理,动态代理,InvocationHandler]
java的代理模式 分为两种,静态代理和动态代理,学习下什么是代理和静态动态代理的作用。
- java代理模式实现
- 代理
- 静态代理
- 静态代理实现
- 动态代理
- 动态代理实现
- 动态代理的意义
- 其他
代理
什么是代理?代理就像中介,房东想租房,所以房东有租房这个方法,想委托给中介帮忙租出去,所以中介就是房东的代理也有租房这个方法,但是那中介除了租房之外可能还有其他操作,比如租房前签合同,租房后收中介费,这些和房东都没有关系。
静态代理
先来看看静态代理的实现
需要准备三个文件
1、抽象接口
2、实际实现类
3、代理类
4、测试类
静态代理实现
1、抽象接口 Subject
定义实现类和代理类的公共方法(或叫公共动作,类似于租房动作)
package com.proxy;
/*** @Author: YLBG-YCY-1325* @Description:* @Date: 2017/8/14*/
public interface Subject {void doSomething();
}
2、定义实现类 (RealSubjct)
这个是实际的源实现类(类似于房东的角色)
package com.proxy;/*** @Author: YLBG-YCY-1325* @Description:* @Date: 2017/8/14*/
public class RealSubject implements Subject{@Overridepublic void doSomething() {System.out.println("代理....");}
}
3、代理类(SubjectProxy)
受RealSubject委托的类(类似于中介的角色),在SubjectProxy类中定义实际实现类(RealSubject)的实例,在做同样动作的时候,代理类可以在前后多做一些逻辑操作(逻辑操作也可以是其他的方法)。
package com.proxy;/*** @Author: YLBG-YCY-1325* @Description:* @Date: 2017/8/14*/
public class SubjectProxy implements Subject{private Subject subject = new RealSubject();@Overridepublic void doSomething() {System.out.println("在doSomething之前的逻辑");subject.doSomething();System.out.println("在doSomething之后的逻辑");}
}
4、测试类
package com.proxy;/*** @Author: YLBG-YCY-1325* @Description:* @Date: 2017/8/14*/
public class ProxyTest {public static void main(String[] args) {SubjectProxy staticSubjectProxy = new SubjectProxy();staticSubjectProxy.doSomething();System.out.println("------------------动态代理-------------");Subject realSubject = new RealSubject();SubjectHandler subjectHandler = new SubjectHandler(realSubject);Subject subjectProxy = (Subject) subjectHandler.getProxy();subjectProxy.doSomething();}
}
代理的意义在于在操作的实际实现类的方法的同时能做一些其他的逻辑(类似于Spring 的 AOP,不过Spring的AOP是动态代理)。
动态代理
动态代理的实现准备了四个文件
1、抽象接口
2、实际实现类
3、调用处理器
4、测试类
抽象接口、实际实现类用原来的就行了;
动态代理实现
实现调用处理器:
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @Author: YLBG-YCY-1325* @Description:* @Date: 2017/8/14*/
public class SubjectHandler implements InvocationHandler {private Object target;public SubjectHandler(Object target) {super();this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before");Object result = method.invoke(target, args);System.out.println("after");return result;}/*** 获取目标代理对象* @return*/public Object getProxy() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}
}
SubjectHandler(Object target) :传入目标类(实际实现类,要委托的类)
invoke(Object proxy, Method method, Object[] args):代理类方法执行
getProxy():获取代理类
具体的实现原理可以参考:JDK动态代理原理探究
测试类:
package com.proxy;/*** @Author: YLBG-YCY-1325* @Description:* @Date: 2017/8/14*/
public class ProxyTest {public static void main(String[] args) {SubjectProxy staticSubjectProxy = new SubjectProxy();staticSubjectProxy.doSomething();System.out.println("------------------动态代理-------------");Subject realSubject = new RealSubject();SubjectHandler subjectHandler = new SubjectHandler(realSubject);Subject subjectProxy = (Subject) subjectHandler.getProxy();subjectProxy.doSomething();}
}
动态代理的意义
动态代理的意义在于动态生成代理类,不用每次都写新的代理类;例如:我们又有新的需求,要写一个新的接口和新的实现类,而这个实现类的方法在执行之前也要做System.out.println(“在doSomething之前的逻辑”) 和 System.out.println(“在doSomething之后的逻辑”) (这两块逻辑是自己定义的逻辑,我这边是上面静态代理上的逻辑)那怎么办?重新写一个代理类呗。是啊,如果是一两个还好,如果有100个需求都要用到那两块逻辑那?爆炸,对不起项目经理我完成不了这个需求,项目经理:用动态代理啊你这个傻缺。所以这就是动态代理的意义,需要处理的逻辑是定死的,你有新的需求每个需求都要用到同用的两块逻辑,OK,动态代理动态生成代理类,完美。
其他
从知乎上接下来了一张图片,总结的非常好,链接地址是:Java 动态代理作用是什么?
图片是:
java代理模式实现相关推荐
- java代理模式_Java代理
java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...
- java代理模式(java代理模式和适配器模式)
Java设计模式的中介者模式是怎样的? 如果对象之间的关系原本一目了然,中介对象的加入便是"画蛇添足". 来看下中介者模式的组成部分吧. 1) 抽象中介者(Mediator)角色: ...
- java代理模式总结
Java代理模式根据代理类生成时间的不同,可以分为静态代理和动态代理,它如同中介机构,可以为目标类提供代理服务,以控制对对象的访问,目标类的任何方法在执行前都必须经过代理类,这样代理类就可以用来负责请 ...
- [Java] 代理模式 Proxy Mode
[Java] 代理模式 Proxy Mode 文章目录 [Java] 代理模式 Proxy Mode 1. 代理思想 2.java.lang.reflect.Proxy类 2.1 利用反射创建prox ...
- 浅谈自己对Java代理模式的理解--即为什么要用怎么用
首先,国际惯例,上Java代理模式的定义: Java代理模式:对其他对象提供一种代理以控制对这个对象的访问. 定义很简单,就一句话,怎么去理解,不急,先听一个小故事: 故事 ...
- 阿里十年资深程序员吐血总结之Java代理模式
阿里十年资深程序员吐血总结之Java代理模式 文章目录 阿里十年资深程序员吐血总结之Java代理模式 1.接口代理 2.类代理 3.动态代理都是通过反射实现的吗 4.jdk动态代理和cglib动态代理 ...
- Java代理模式汇编
文章目录 Java 代理模式实现方式,主流如下五种方法 Notes 静态代理实现 实现步骤 Cat接口 委托类 Lion 代理类角色(FeederProxy) 静态代理类测试 动态代理类(基于接口实现 ...
- Java代理模式/静态代理/动态代理
代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...
- 说说 JAVA 代理模式
原文出处: 姜肇海 投稿 事例 小张是一个普普通通的码农,每天勤勤恳恳地码代码.某天中午小张刚要去吃饭,一个电话打到了他的手机上."是XX公司的小张吗?我是YY公司的王AA".&q ...
最新文章
- 第三次学JAVA再学不好就吃翔(part27)--自定义工具类
- 流畅的Python 5. 函数
- python面试题之介绍一下Python中webbrowser的用法
- axure rp web元件ku_Axure教程丨制作自己的Axure元件库
- 修正版 疯狂代码 写给WEB2.0的站长
- 乐优商城(一)项目介绍
- 电力IEC104规约协议解读(含源码下载)
- SVN的目录结构,trunk、tag、branches
- ubuntu 安装和删除字体
- 文青山在自动化测试空间的博客
- 信息熵与老鼠试药、称球问题
- java秃顶_【本人秃顶程序员】在Java中使用函数范式提高代码质量
- android 手机分区失败怎么办,一种Android系统Data分区自修复方法及系统专利_专利查询 - 天眼查...
- 调整Ubuntu16.04屏幕分辨率
- Dynamic Debug [dyndbg] 概述
- 开发者模式之GPU渲染模式分析
- 红包拆分算法 php,关于PHP实现微信红包金额拆分的算法
- Z-INDEX: 999
- MAC系统打造基于VIM的IDE
- 入手多普达D900(T版)- 心疼
热门文章
- led亮度鉴别测试软件,测试LED颜色与亮度——FeasaLED测试仪
- Android 安卓告别SharedPreFerences,你好MMKV
- 艾美捷RPMI-1640培养基含L-谷氨酰胺的功能和研究
- JS、阻止 a 标签的默认点击事件,阻止默认的所有事件
- MySQL创建组合索引
- 什么是VPS云服务器?
- Verilog学习笔记(5):Verilog高级程序设计
- Integer的equals方法
- 2021-2027全球与中国多媒体教室投影仪市场现状及未来发展趋势
- 打包aab_手动安装Android .abb(bundletool 如何使用)(.aab安装)(GooglePlay测试)...