动态代理Java实现
思考:在IBuyWatermelon添加一个方法selectWatermelon()
静态代理中需要在RealSubject中实现该方法,而且Proxy也要实现该方法调用RealSubject中的实现,如果再增加10个方法还是得这样操作,导致大量的代码重复。
现在来看动态代理(顾名思义,是在运行时才形成的代理对象,不像静态代理在编译时就载入代理对象)。
生成动态代理的方法有很多: JDK中自带的动态代理java.lang.reflect.*, CGlib等
下面的例子是JDK中自带的动态代理java.lang.reflect.*
IBuyWatermelon():接口
package com.maggie.dynamicproxy;public interface IBuyWatermelon {//代理事件public abstract String buyWatermelon();public abstract void selectWatermelon(); }
BuyWatermelonImpl:实现类
package com.maggie.dynamicproxy;//可理解成被代理者 public class BuyWatermelonImpl implements IBuyWatermelon {private Supermarket supermaket;public BuyWatermelonImpl(Supermarket supermaket) {super();this.supermaket = supermaket;}@Overridepublic String buyWatermelon() {System.out.println("在"+supermaket.getName()+" 买西瓜");return "watermelon";}@Overridepublic void selectWatermelon() {System.out.println("选择无籽西瓜");}}
ProxyFactory:代理对象类(核心代码)
package com.maggie.dynamicproxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class ProxyFactory {//维护一个目标对象private Object target;public ProxyFactory(Object target){this.target=target;}//给目标对象生成代理对象public Object getProxyInstance(){//动态代理的核心,涉及到反射return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//执行目标对象方法Object returnValue = method.invoke(target, args);return returnValue;}});} }
客户端调用
package com.maggie.dynamicproxy;public class Main {public static void main(String[] args) {Supermarket zhaoLiu = new Supermarket();zhaoLiu.setName("赵六超市");IBuyWatermelon target = new BuyWatermelonImpl(zhaoLiu);//被代理的对象//创建代理对象IBuyWatermelon hourskeeper = (IBuyWatermelon) new ProxyFactory(target).getProxyInstance();hourskeeper.buyWatermelon();hourskeeper.selectWatermelon();} }
输出
在赵六超市 买西瓜 选择无籽西瓜
现在就算IBuyWatermelon的方法再怎么增加,也只需要在BuyWatermelonImpl实现,就可以在客户端调用,不会出现大量的重复代码。
从静态代理到动态代理都围绕着卖瓜事件,为了前后方便比较,但是动态代理并没完,里面的源码机制才是核心关键
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)这个方法是整个动态代理实现的关键
转载于:https://www.cnblogs.com/maggiejyt/p/7569123.html
动态代理Java实现相关推荐
- 分布式锁 动态代理 Java数据结构List,Set,Map,Spring执行流程,Spring MVC组件
这里对今日的内容进行总结: 分布式锁具备的条件: 具备的条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行. 高可用的获取锁与释放锁. 高性能的获取锁与释放锁. 具备可重入的特 ...
- 小小理解动态代理java
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflec ...
- java高级----Java动态代理的原理
Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...
- Java动态代理简述
Java动态代理简述 一.代理简介 代理一词含义十分宽泛,例如金融领域的股票发行代理.营销领域的销售代理.以及计算机领域中的代理设计模式等.尽管代理一词被使用的领域如此广泛,但是代理一词的大致的抽象含 ...
- Java笔记(二十一) 动态代理
动态代理 一.静态代理 代理的背后一般至少有一个实际对象,代理的外部功能和实际对象一般是一样的, 用户与代理打交道,不直接接触实际对象.代理存在的价值: 1)节省成本比较高的实际对象创建开销,按需延迟 ...
- 一文带你弄懂 Java 动态代理 | 原力计划
作者 | mjzuo 责编 | 王晓曼 出品 | CSDN 博客 在说动态代理之前,先来简单看下代理模式. 代理是最基本的设计模式之一.它能够插入一个用来替代"实际"对象的&quo ...
- Java JDK 动态代理
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代 ...
- Javaweb安全——Java动态代理
Java 动态代理 Java的java.lang.reflect包下提供了一个Proxy类和InvocationHandler接口,可以生成JDK动态代理类或对象来完成程序无侵入式扩展(即不通过继承接 ...
- java动态代理两种实现方式
代理顾名思义就是代理别人完成某件任务,比如张三代理李四去交物业费.张三就是代理人,李四就是被代理人. Java代理实现,有静态代理和动态代理,静态代理就是代码在编译成class文件后,就已经有代理类的 ...
最新文章
- 利用硅光子学的移动心脏监护仪
- 什么是textRNN?有什么用途?结构是什么样子的?
- pl/sql dev连接报错Access violation at address 67614F04 in module 'oranls11.dll'
- 【Linux系统】Linux命令之文件管理
- 【VMCloud云平台】Demo应用搭建(二)
- 剑指offer-翻转单词顺序列
- Form.php 日期表单,Bootstrap日期和时间表单组件使用方法
- 引出发射和什么是反射和Class类和Class实例、基本类型的字节码对象
- (map)出现最多的数
- 如何在linux上创建数据库,在LINUX平台上手动创建数据库(oracle 10g)
- cms文章 mysql存储,帝国CMS万能标签调用随机文章的方法
- css中实现子父元素高度自适应子元素高度
- C语言教学模式 教学方法改革,C语言教学模式改革探究.docx
- 做自适应网站专业乐云seo_网站建设技术很 棒乐云seo:SEO技术这碗青春饭,跪
- Office2016、visio2016安装的注意事项
- 各种类型相机rtsp取流格式大汇总
- web应用存在的10大安全问题,安全测试不容忽视!
- CTF之旅WEB篇(4)--NewStarCTF 公开赛IncludeOne详解
- Java—求某个范围内的所有素数
- xshell如何清除历史命令