思考:在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实现相关推荐

  1. 分布式锁 动态代理 Java数据结构List,Set,Map,Spring执行流程,Spring MVC组件

    这里对今日的内容进行总结: 分布式锁具备的条件: 具备的条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行. 高可用的获取锁与释放锁. 高性能的获取锁与释放锁. 具备可重入的特 ...

  2. 小小理解动态代理java

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflec ...

  3. java高级----Java动态代理的原理

    Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...

  4. Java动态代理简述

    Java动态代理简述 一.代理简介 代理一词含义十分宽泛,例如金融领域的股票发行代理.营销领域的销售代理.以及计算机领域中的代理设计模式等.尽管代理一词被使用的领域如此广泛,但是代理一词的大致的抽象含 ...

  5. Java笔记(二十一) 动态代理

    动态代理 一.静态代理 代理的背后一般至少有一个实际对象,代理的外部功能和实际对象一般是一样的, 用户与代理打交道,不直接接触实际对象.代理存在的价值: 1)节省成本比较高的实际对象创建开销,按需延迟 ...

  6. 一文带你弄懂 Java 动态代理 | 原力计划

    作者 | mjzuo 责编 | 王晓曼 出品 | CSDN 博客 在说动态代理之前,先来简单看下代理模式. 代理是最基本的设计模式之一.它能够插入一个用来替代"实际"对象的&quo ...

  7. Java JDK 动态代理

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代 ...

  8. Javaweb安全——Java动态代理

    Java 动态代理 Java的java.lang.reflect包下提供了一个Proxy类和InvocationHandler接口,可以生成JDK动态代理类或对象来完成程序无侵入式扩展(即不通过继承接 ...

  9. java动态代理两种实现方式

    代理顾名思义就是代理别人完成某件任务,比如张三代理李四去交物业费.张三就是代理人,李四就是被代理人. Java代理实现,有静态代理和动态代理,静态代理就是代码在编译成class文件后,就已经有代理类的 ...

最新文章

  1. 利用硅光子学的移动心脏监护仪
  2. 什么是textRNN?有什么用途?结构是什么样子的?
  3. pl/sql dev连接报错Access violation at address 67614F04 in module 'oranls11.dll'
  4. 【Linux系统】Linux命令之文件管理
  5. 【VMCloud云平台】Demo应用搭建(二)
  6. 剑指offer-翻转单词顺序列
  7. Form.php 日期表单,Bootstrap日期和时间表单组件使用方法
  8. 引出发射和什么是反射和Class类和Class实例、基本类型的字节码对象
  9. (map)出现最多的数
  10. 如何在linux上创建数据库,在LINUX平台上手动创建数据库(oracle 10g)
  11. cms文章 mysql存储,帝国CMS万能标签调用随机文章的方法
  12. css中实现子父元素高度自适应子元素高度
  13. C语言教学模式 教学方法改革,C语言教学模式改革探究.docx
  14. 做自适应网站专业乐云seo_网站建设技术很 棒乐云seo:SEO技术这碗青春饭,跪
  15. Office2016、visio2016安装的注意事项
  16. 各种类型相机rtsp取流格式大汇总
  17. web应用存在的10大安全问题,安全测试不容忽视!
  18. CTF之旅WEB篇(4)--NewStarCTF 公开赛IncludeOne详解
  19. Java—求某个范围内的所有素数
  20. xshell如何清除历史命令

热门文章

  1. IDEA实时编译配置流程
  2. 二、mongodb数据库系列——聚合操作 索引操作 权限管理
  3. python 动态属性和特性
  4. Hive是如何让MapReduce实现SQL操作的?
  5. LeetCode 1278. 分割回文串 III(区间DP)
  6. LeetCode 808. 分汤(动态规划)
  7. 阿里云 超级码力在线编程大赛初赛 第1场(第245名)
  8. LeetCode 305. 岛屿数量 II(并查集)
  9. crontab 执行php脚本,为什么crontab没有执行我的PHP脚本?
  10. 利用numpy删除DataFrame某一行/列、多行内容