java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。...
1、java自带的proxy类可以创建动态类,如果一个类实现了一个接口那么久可以为这个类创建代理。
2、代理:就是当用户要调用一个类的方法时,用户可以通过调用代理,代理通过接口调用原来的类的方法,代理在把方法给用户前可以添加一些方法,如错误日志,用户类的方法运行的时间来监听类方法的性能。当代理完成时候就是当代理调用方法时候,就会启动InvocationHandler里的invoke方法。用户并不知道用户要为哪个类带理,因此在框架中用配置文件来获取代理的类,用户需要用框架时候就修改配置文件即可。
public class Proxydemo {public static void main(String[] args) throws Exception {//这是分2部,来实现collection的代理的,下面是1步实现代理,并且是任何类
// Class classproxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
// Constructor[]constructors=classproxy.getConstructors();
// Constructor constructor=classproxy.getConstructor(java.lang.reflect.InvocationHandler.class);
// for(Constructor c:constructors)
// {
// System.out.println(c.toString());
// }final ArrayList a=new ArrayList<>();
// Collection c=(Collection) constructors[0].newInstance(new InvocationHandler(){
//
// @Override
// public Object invoke(Object proxy, Method method, Object[] args)
// throws Throwable {
// ArrayList a=new ArrayList<>();
// System.out.println(System.currentTimeMillis());
// Object ob=method.invoke(a ,args);
// System.out.println("a的size:"+a.size());
// System.out.println(System.currentTimeMillis());
// return ob;
// }
//
// });c.add("dada"); c.add("dada");System.out.println( c.size());
// //下面是实现代理的原理,pr是给代理的接口,advice是代理要监控方法的接口final Pro pr=new ProtexTest();final Advice advice=new MyAdvice();Pro classproxy=(Pro)Proxy.newProxyInstance(pr.getClass().getClassLoader(), new Class[]{Pro.class}, new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {advice.beforemethod();//这是方法前调用的方法Object o=method.invoke(pr, args);advice.aftermethod();//这是方法后调用的方法return o;}});
//当调用sayhello时候,系统就去找代理调用InvocationHandler里的invoke方法。classproxy.sayhello();
/* 所以打印结果为:1441522392491hello1441522392493
*/ //调用代理函数Pro o=(Pro) daili(pr,advice);o.sayhello();}/******************下面可以吧上面的方法抽出为一个代理方法,为任何实现接口的类代理*****//** target 为目标类实现的接口* advice为代理要监控方法的接口*/public static Object daili(final Object target,final Advice advice){Object classproxy=(Object)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {advice.beforemethod();//这是方法前调用的方法Object o=method.invoke(target, args);advice.aftermethod();//这是方法后调用的方法return o;//返回方法执行后返回的值}});return classproxy;}
}
转载于:https://www.cnblogs.com/bokeofzp/p/4786308.html
java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。...相关推荐
- python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...
昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...
- 【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )
文章目录 一.Expando 动态类简介 二.动态类创建 三.为动态类增加字段和方法 四.完整代码示例 一.Expando 动态类简介 Groovy 运行时 , 可以动态地创建一个类 , 该类称为 & ...
- Java张孝祥视频 学习笔记 代理
/***************************************************************************************/ 此博客主要是在观看张 ...
- 【学习笔记】结合代码理解设计模式 —— 代理模式(静态代理、动态代理、延伸)
文章目录 什么是代理模式 一. 代理模式简介 二. 静态代理模式 三. 动态代理模式 万能模版 前言:笔记基于狂神设计模式视频.<大话设计模式>观后而写 (最近一直在更新之前的刷题博客,今 ...
- JAVA【创建笔记本电脑类】笔记
创建笔记本电脑类(继承一个类,实现多个接口) 创建NetCard接口和USB接口,创建Computer抽象类,然后继承Computer类,实现NetCard接口和USB接口,创建笔记本电脑类Lapto ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
- java struct工作原理_Struts2的工作原理(图解)详解
Struts2的工作原理 上图来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码:https://github.com ...
- 类脑计算机有什么用处,亿级神经元类脑计算机发布的意义,亿级神经元类脑是什么概念...
亿级神经元类脑计算机发布,其意味着什么? 9月1日,浙江大学和之江实验室在杭州发布了一台包含1.2亿个脉冲神经元和近1000亿个突触的类脑计算机.这台计算机使用浙江大学开发的792 达尔文第二代类脑芯 ...
- Java EE 课程作业(Fifth)-- XML:定义 用途 工作原理及未来xml
一.XML定义: XML即可扩展标记语言(eXtensible Markup Language).标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等.如何定义这些标 ...
最新文章
- 练习10-1 使用递归函数计算1到n之和 (10 分)
- React+Redux开发实录(一)搭建工程脚手架
- Python创建二维数组(关于list的一个小坑)
- python常用的工具函数
- 各种PID算法的整理和总结
- iOS 证书错误 Certificates下面的 App Store and Ad Hoc是灰的?? 点不了
- Android使用jxl快速生成Excel表
- zc702运行linux,笔记:ZC702之linux运行
- canvas 实现雷达图
- linux6磁盘绑定,关于Linux 6使用udev绑定共享磁盘的测试
- 计算机图形学 之 中点画线算法
- 公司员工考勤系统Java代码
- 写论文、搞科研、读大学必备的28款软件。
- 基于Springboot实现汽车4S店销售管理系统
- 线性方程组解的结构与判别
- android10怎么截屏,安卓手机怎么截图?安卓手机截图方法大全
- 关闭数据库时SHUTDOWN: waiting for active calls to complete.处理
- MarkdownPad2安装汉化与注册码
- Spring基础-AOP-切入点详解
- 三菱fx3u编码器同步程序,伺服同步,一个编码器控制两个伺服同步运转
热门文章
- 关于VC++6.0中getline函数的一个bug
- ASP.NET MVC3 中的AJAX
- CustomValidator
- 模切ERP和免费OA系统是互相结合提高效率
- 安卓开发 新浪微博share接口实现发带本地图片的微博
- QTP提供的编程接口实现对QTP操作
- 《.NET最佳实践》与Ext JS/Touch的团队开发
- 【原创】什么是 wire protocol
- 数据库中使用自增量字段与Guid字段作主键的性能对比(补充篇)-----转
- 计算机操作系统指导书,《计算机操作系统》实验指导书-2015