TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理
2024-10-20 16:18:29
代理:为了增强方法在不添加代码的情况下
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); } }
最新文章
- angularjs 中的setTimeout(),setInterval() / $interval 和 $timeout
- linux 学习 day1
- UWP滑动后退
- Linux System and Performance Monitoring
- [iOS OpenCV错误解决]
- MapReduce之单词计数
- POJ 1724 ROADS(BFS+优先队列)
- 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)
- ORA-15025: could not open disk 处理
- ajax跨域访问 webservice
- YZOI Easy Round 2_回文串 string
- ubunu设置java命令为全局的命令-添加到全局环境变量
- Summary Ranges 解答
- 五毛的cocos2d-x学习笔记02-基本项目源码分析
- 使用Jenkins来构建Docker容器
- 微信公众平台开发-access_token获取及应用(含源码)
- 使用XAMPP和DVWA在Windows7上搭建渗透测试环境
- Android为TV端助力 MediaPlayer API大全已经方法详解(转载)
- Shiro-Subject 分析
- OpenCV——图像的深度与通道数讲解