代理:为了增强方法在不添加代码的情况下

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); } }

最新文章

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

热门文章

  1. Python全栈开发:基本数据类型
  2. vue中 给router-view 组件的 绑定 key 的原因
  3. 代码风格JavaScript standard style与Airbnb style
  4. 阿里巴巴飞天大数据架构体系与Hadoop生态系统
  5. Joomla - 后台系统(功能简介)
  6. poi 3669 meteor shower (bfs)
  7. BASE64Encoder及BASE64Decoder查看源代码方法
  8. css 超出两行省略号,超出一行省略号
  9. 如何在easyui datagrid 中显示外键的值
  10. 在HBase之上构建SQL引擎