TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理
代理:为了增强方法在不添加代码的情况下
1.Proxy基于接口的动态代理
/**
* 模拟一个消费者
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
final Prodecer prodecer = new Prodecer();
/**
* 动态代理:
* 特点:字节码随用随创建,随用随加载
* 作用:不修改源码的基础上对方法增强
* 分类:
* 1.基于接口的动态代理
* 2.基于子类的动态代理
* 基于接口的动态代理
* 涉及的类:Proxy
* 提供者 :jdk官方
* 如何创建代理对象:
* 使用Proxy类中的newProxyInstance方法
* 创建代理类的要求
* 被代理的类最少实现一个接口,
* newProxyInsttance方法参数,
* 参数 :Classloader 累加载器:用于加载代理对象字节码的。和被代理对象使用相同的类加载器
* nterfaces 被代理对象实现的接口
* InvocationHandler 他是让我们如何写代理,我们一般写该接口的实现类。通常写匿名内部类
*
*/
IProdecer proxyProducer = (IProdecer) Proxy.newProxyInstance(prodecer.getClass().getClassLoader(),
prodecer.getClass().getInterfaces(), new InvocationHandler() { /**
* 作用:执行被代理对象的任何接口方法都会经过该方法
* proxy 代理对象的引用
* method 当前执行的方法
* args 当前方法执行所需的参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//提供增强的代码
Object returnValue=null;
//1.获取方法执行的参数
float money=(Float) args[0];
//判断当前方法是不是saleProdect
if ("saleProdect".equals(method.getName())) {
returnValue=method.invoke(prodecer, money*0.8f);
}
return returnValue;
}
});
proxyProducer.saleProdect(1000f); } }
2.基于类的动态代理
/**
* 模拟一个消费者
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
final Prodecer prodecer = new Prodecer();
/**
* 动态代理:
* 特点:字节码随用随创建,随用随加载
* 作用:不修改源码的基础上对方法增强
* 分类:
* 1.基于接口的动态代理
* 2.基于子类的动态代理
* 基于类的动态代理
* 涉及的类:Enhancer
* 提供者 :第三方cglib库
* 如何创建代理对象:
* 使用Enhance类中的create方法
* 创建代理类的要求
* 被代理的类不能是最终类
* create方法参数,
* 参数 : Class:字节码 用于指定被代理对象的字节码
* callback 他是让我们如何写代理,我们一般写该接口的子接口的实现类。通常写匿名内部类
* methodProxy:当前执行方法的代理对象
*/
Prodecer cglibProdecer=(Prodecer) Enhancer.create(prodecer.getClass(), new MethodInterceptor() { public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//提供增强的代码
Object returnValue=null;
//1.获取方法执行的参数
float money=(Float) args[0];
//判断当前方法是不是saleProdect
if ("saleProdect".equals(method.getName())) {
returnValue=method.invoke(prodecer, money*0.8f);
}
return returnValue;
}
});
cglibProdecer.saleProdect(1000f); } }
TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理的更多相关文章
- Spring AOP 介绍与基于接口的实现
热烈推荐:超多IT资源,尽在798资源网 声明:转载文章,为防止丢失所以做此备份. 本文来自公众号:程序之心 原文地址:https://mp.weixin.qq.com/s/vo94gVyTss0LY ...
- 代理模式详解:静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...
- Java代理模式精讲之静态代理,动态代理,CGLib代理
代理(Proxy)是一种设计模式,通俗的讲就是通过别人达到自己不可告人的目的(玩笑). 如图: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象 这三个代理模式,就 ...
- 【译】12. Java反射——类的动态加载和重新加载
原文地址:http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html 博主最近比较忙,争取每周翻译 ...
- 最简单的动态代理实例(spring基于接口代理的AOP原理)
JDK的动态代理是基于接口的 package com.open.aop; public interface BusinessInterface { public void processBus ...
- 阶段3 2.Spring_07.银行转账案例_8 基于接口的动态代理回顾
创建 Producer 生产者的类 创建标准.这标准就是接口 创建消费者的类 以前的方式,客户直接找生产厂家 代理商出现以后,怎么去联系代理商 动态代理 第一个参数是ClassLoader 第二个参数 ...
- JDK动态代理为什么必须要基于接口?
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和 ...
- 动态代理到基于动态代理的AOP
动态代理,是java支持的一种程序设计方法. 动态代理实现中有两个重要的接口和类,分别是InvocationHandler(interface),Proxy(class). 要实现动态代理,必须要定义 ...
- 【Java】代理模式,静态代理和动态代理(基于JDK或CGLib)
当我们需要在一个方法之前或之后添加一段逻辑时,自然会想到使用代理类.代理类帮我们代理了实际类的调用,然后可以在实际调用之前和之后添加一些逻辑,从而不浸入实际类. 拓展:由于代理类能在实际类调用之前和之 ...
随机推荐
- 提问(prompt 消息对话框)用于询问一些需要与用户交互的信息。弹出消息对话框(包含一个确定按钮、取消按钮与一个文本输入框)
提问(prompt 消息对话框) prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, s ...
- godaddy账号以及域名被盗找回经历以及网络信息安全的思考
本案涉及到公司的一些机密信息,因此涉及到机密信息,我都将会用一些其他的代号进行替代.不影响读者理解本案.我会按照时间顺序讲述本案经过,是如何一步步找回godaddy账号的. 我供职的公司是一家网络科技 ...
- 【笔记篇】C#笔记2
返回目录:目录请戳这里~ C#数组 基本概念不提.. int[] a; bool[] b = new bool[10]; float[] c = {0.5, 57.0, 233.3, 12345.67 ...
- Luogu P2822 组合数问题(前缀和)
P2822 组合数问题 题意 题目描述 组合数\(C_n^m\)表示的是从\(n\)个物品中选出\(m\)个物品的方案数.举个例子,从\((1,2,3)\)三个物品中选择两个物品可以有\((1,2), ...
- gdb调试工具的使用
GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调 ...
- Linux 启动出现 busybox vx.x.xx built-in shell 的问题
可能是磁盘检测错误,尤其出现在未安全关机或者磁盘损坏之后. 解决办法: 1.在选择启动项目时,选中第一项,如: ubuntu 8.04kernl.2.6.22-16-generic 2.按E 进入编辑 ...
- JS对象迭代v-for
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- Django之模板语言(三)------>自定义filter
1.自定义filter: 1.在app01下面新建一个templatetags的python package包. 如果没有app01的话,可以通过命令行在manage中进行创建:python mana ...
- ftp文件上传下载命令
介绍:从本地以用户wasqry登录的机器1*.1**.21.67上通过ftp远程登录到ftp服务器上,登录用户名是lte****,以下为使用该连接做的实验. 查看远程ftp服务器上用户lte**** ...
- 06-6-es6模板字符串
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...