动态代理分析

基于接口的动态代理

package com.test2;public interface IProducer{public void saleProduct(float money);public void afterSalesService(float money);
}package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;/*** 模拟一个客户* @author Administrator**/
public class Client {public static void main(String[] args) {final Producer producer = new Producer();
//      producer.saleProduct(10000f);/*** 动态代理的特点,字节码随用随创建,随用随加载* 作用是不修改源码的基础上,对方法增强* 分为基于接口的动态代理,和基于子类的动态代理* 基于接口的动态代理*        涉及的类 Proxy*         提供者 jdk官方* 如何创建代理对象 使用Proxy 中 的newProxyInstance方法* 创建代理对象的要求:*       被代理类至少实现一个接口* newProxyInstance方法的参数:*        ClassLoader*            用于加载代理对象字节码的,写的是被代理对象的类加载器(和被代理对象使用相同的类加载器),固定写法*       Class[]字节码数组*           用于让代理对象和被代理对象有相同的方法,固定写法*        InvocationHandler*          用于提供增强的方法。通常是写一个实现该接口的匿名实现类,但非必须*/IProducer proxyProducer = (IProducer)Proxy.newProxyInstance
(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler(){/*** invoke方法作用*        被代理对象的任何接口方法都会经过该方法* @param proxy  代理对象的引用* @param method     当前执行的方法* @param ags        当前执行方法所需的参数* @return           和被代理对象方法有相同的返回值* @throws           Throwable*/@Overridepublic Object invoke(Object proxy,Method method,Object[] args)throws Throwable{//提供增强的代码Object returnValue = null;//1.获取方法执行的参数Float money = (Float)args[0];//2.判断当前方法是什么方法if("saleProduct".equals(method.getName())){returnValue = method.invoke(producer,money*0.8f);}return returnValue;}});proxyProducer.saleProduct(10000f);}}

卖出产品,得到8000.0

基于子类的动态代理

涉及的类 Enhancer
提供者 第三方cglib

package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;/*** 模拟一个客户* @author Administrator**/
public class Client {public static void main(String[] args) {final Producer producer = new Producer();
//      producer.saleProduct(10000f);/*** create参数*     Class 用于指定被代理对象的字节码*    Callback 用于提供增强代码*/Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor(){/*** @param* @param* @param*/@Overridepublic Object intercept(Object proxy, Method method,
Object[] args, MethodProxy methodProxy) throws Throwable {// TODO Auto-generated method stub
//              提供增强的代码Object returnValue = null;//1.获取方法执行的参数Float money = (Float)args[0];//2.判断当前方法是什么方法if("saleProduct".equals(method.getName())){returnValue = method.invoke(producer,money*0.8f);}return returnValue;}});cglibProducer.saleProduct(10000f);}}

卖出产品,得到8000.0

动态代理的作用是什么呢? 数据库连接池close在关闭的时候不会真正的关闭而是要还回池中,就可以使用动态代理对getThreadConnection的close()方法进行增强

解决全站中文乱码的request方法的增强,对getParameter()方法增强

spring5.0学习笔记8相关推荐

  1. mysql5.0镜像_Mysql5.0学习笔记(一)

    Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...

  2. Zabbx6.0(学习笔记)

    Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...

  3. flink1.12.0学习笔记第2篇-流批一体API

    flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...

  4. CCC3.0学习笔记_认证和隐私保护

    CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...

  5. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  6. 《TP5.0学习笔记---配置篇》

    TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...

  7. Tensorflow2.0学习笔记(一)

    Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...

  8. Tensorflow2.0学习笔记(二)

    Tensorflow2.0学习笔记(二)--Keras练习 文章目录 Tensorflow2.0学习笔记(二)--Keras练习 前言 二.使用步骤 1.实现步骤及代码 2.下载 Fashion MN ...

  9. CCC3.0学习笔记_数字密钥数据结构

    CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...

  10. Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲

    Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲 返回目录 这个笔记现在是主要根据北京大学曹健老师的视频写的,这个视频超级棒,非常推荐. 第一讲 常用函数的使用(包含了很多琐碎的函 ...

最新文章

  1. Apache 配置 Basic 认证
  2. Please move ‘proctime(r_proctime)‘ to the end of the schema.以及rowtime和proctime
  3. MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
  4. RealView MDK在链接时提示空间不够的解决方案总结
  5. 亚马逊新专利:Alexa可根据用户的语音识别疾病或抑郁
  6. 计算机网络课程设计个人总结,计算机网络课程设计心得体会.doc
  7. VC与matlab混合编程
  8. 推荐 五个单变量时间序列数据集
  9. 支付宝VS微信,谁在抄袭谁?
  10. 110道 Redis面试题及答案 (持续更新)
  11. 应聘新要求:填写恋爱经历?
  12. Ceres-Solver使用指南
  13. 数字图像处理--第六章彩色图像处理基础
  14. Java超详细基础知识
  15. 卫星天线如何接受CCTV-5nbsp;CCTV-6
  16. NAS如何进行磁盘碎片整理?
  17. 100例(p019—p021)
  18. 解决Visual C++ Redistributable安装找不到vc_runtimeMinimum_x86.msi最简单办法
  19. App 运营 推广相关
  20. Unity中Camera参数—Culling Mask详解

热门文章

  1. 重装XP后无法启动LINUX的解决方案
  2. 小额现金贷用户群体分析及风控体系搭建
  3. 尝试Adam代替梯度下降
  4. GraphQL到底怎么用?看看这个例子就知道了
  5. 基于nodejs的模拟数据分发服务
  6. AC日记——Flag Codeforces 16a
  7. 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)...
  8. Active Record 数据库模式-增删改查操作
  9. 如何将秘钥分发到多台机器
  10. MySQL优化步骤和my.cnf优化配置