JDK 自带的动态代理

java.lang.reflect.Proxy:生成动态代理类和对象;

java.lang.reflect.InvocationHandler(处理器接口):可以通过invoke方法实现

对真实角色的代理访问。

每次通过 Proxy 生成的代理类对象都要指定对应的处理器对象。

代码:

a) 接口:Subject.java

**

* @author gnehcgnaw

* @date 2018/11/5 19:29

*/

public interface Subject {

public int sellBooks();

public String speak();

}

b)真实对象:RealSubject.java

/**

* @author gnehcgnaw

* @date 2018/11/5 18:54

*/

public class RealSubject implements Subject{

@Override

public int sellBooks() {

System.out.println("卖书");

return 1 ;

}

@Override

public String speak() {

System.out.println("说话");

return "张三";

}

}

c)处理器对象:MyInvocationHandler.java

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

/**

* 定义一个处理器

* @author gnehcgnaw

* @date 2018/11/5 19:26

*/

public class MyInvocationHandler implements InvocationHandler {

/**

* 因为需要处理真实角色,所以要把真实角色传进来

*/

Subject realSubject ;

public MyInvocationHandler(Subject realSubject) {

this.realSubject = realSubject;

}

/**

*

* @param proxy 代理类

* @param method 正在调用的方法

* @param args 方法的参数

* @return

* @throws Throwable

*/

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("调用代理类");

if(method.getName().equals("sellBooks")){

int invoke = (int)method.invoke(realSubject, args);

System.out.println("调用的是卖书的方法");

return invoke ;

}else {

String string = (String) method.invoke(realSubject,args) ;

System.out.println("调用的是说话的方法");

return string ;

}

}

}

d)调用端:Main.java

import java.lang.reflect.Proxy;

/**

* 调用类

* @author gnehcgnaw

* @date 2018/11/7 20:26

*/

public class Client {

public static void main(String[] args) {

//真实对象

Subject realSubject = new RealSubject();

MyInvocationHandler myInvocationHandler = new MyInvocationHandler(realSubject);

//代理对象

Subject proxyClass = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Subject.class}, myInvocationHandler);

proxyClass.sellBooks();

proxyClass.speak();

}

}

gnehcgnaw

gnehcgnaw

949***604@qq.com2年前 (2018-11-13)

python中代理模式分为几种类型_代理模式相关推荐

  1. c语言上11e2是实型常量吗,在C语言中的实型变量分为两种类型.doc

    在C语言中的实型变量分为两种类型.doc 第二章 练习题 一.填空题 1.在C语言中的实型变量分为两种类型,它们是float型和( )型. 2.若有定义:char c='\010';则变量c中包含的字 ...

  2. c语言中的实型变量语法,在C语言中的实型变量分为两种类型

    在C语言中的实型变量分为两种类型 第二章 练习题 一.填空题 1.在C语言中的实型变量分为两种类型,它们是float型和( )型. 2.若有定义:char c= \010 ;则变量c中包含的字符个数为 ...

  3. python遗传算法最短路径问题有几种类型_遗传算法求最短路径 - osc_tn8uhjgi的个人空间 - OSCHINA - 中文开源技术交流社区...

    实例描述 配送中心数为 $1$,客户数 $k$为 $8$,车辆总数 $m$为 $2$:车辆载重皆为 $8$ 吨:各客户点需求为 $g(i = 1, 2, ... , 8)$(单位为吨),已知客户点与配 ...

  4. 四种类型的数据分析模式

    在这篇博文中,我们聚焦于在数据科学领域所遇到的四种类型的数据分析模式:描述型.诊断型.预测型和指导型. 当我与刚涉足数据科学领域的年轻分析师们交谈时,通常,我会问他们认为什么是数据科学家最重要的能力. ...

  5. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

  6. 神经网络按功能分为几类,神经网络分为几种类型

    神经网络有哪些主要分类规则并如何分类? 神经网络模型的分类人工神经网络的模型很多,可以按照不同的方法进行分类.其中,常见的两种分类方法是,按照网络连接的拓朴结构分类和按照网络内部的信息流向分类. 1按 ...

  7. 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流

    Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...

  8. 云计算机根据部署方式,云计算的三种类型及部署模式

    云计算的三种类型及部署模式 猫先生 • 2019 年 07 月 08 日 云计算让开发人员和 IT 部门可以全身心投入最有价值的工作,避免采购.维护.容量规划等无价值的工作分散精力.云计算已经日渐普及 ...

  9. python取整的几种方法,Python中取整的几种方法小结

    Python中取整的几种方法小结 前言 对每位程序员来说,在编程过程中数据处理是不可避免的,很多时候都需要根据需求把获取到的数据进行处理,取整则是最基本的数据处理.取整的方式则包括向下取整.四舍五入. ...

最新文章

  1. Spring Boot下的Tomcat,你真的会用吗?
  2. linux_一些shell命令分析记录
  3. Spring cloud整合zookeeper
  4. 分布式转码初步方案(hadoop+ffmpeg)
  5. istio回归「单体应用」对我们的启发
  6. java 编写代码_Java 7:如何编写非常快速的Java代码
  7. Java如何加载类的呢?
  8. 1-1. 虚拟机控制
  9. linux修改默认python版本_Linux 升级 Python 并修改默认版本
  10. 大数据入门(一)-大数据概念和特点(1)
  11. 03.三月风雨愁断肠,学习大数据特别忧伤——谈谈AKS创建SQL Server大数据群集创建愁断肠
  12. C# 将PDF文件转换为word格式
  13. scratch炫酷格斗游戏
  14. AAC MP3音频帧采样点大小
  15. 我的 Serverless 实战 — Serverless 腾讯云文字识别(OCR)详细部署过程
  16. 利用泰勒展开式实现sin(x),cos(x)函数
  17. 复合函数求导定义证明,复合函数求导法则的又一证明
  18. android 状态栏显示 耳机图标显示,Android4.0-4.4 加入支持状态栏显示耳机图标方法(支持带不带MIC的两种耳机自己主动识别)...
  19. LRU(Least Recent Used) java实现——为什么采用HashMap+双向链表
  20. 2023 开工大吉!爆料各司年终奖

热门文章

  1. r语言python print包_python : 批量下载R语言库包
  2. mongo执行逻辑表达式_MongoDB 高级查询
  3. python爬虫简单的添加代理进行访问
  4. 电气期刊论文实现:二进制遗传算法求解考虑输电损耗的负荷最优分配【经济调度,有代码】
  5. VTK:ShareCamera分享相机用法实战
  6. VTK:背景渐变BackgroundGradient用法实战
  7. wxWidgets 示例演示 wxWizard 控件
  8. wxWidgets:键盘 wxWidgets 示例
  9. wxWidgets:wxList< T >类模板的用法
  10. wxWidgets:wxGenericDirCtrl类用法