动态代理
来源:互联网 发布:js防水涂料怎么调配 编辑:程序博客网 时间:2024/06/04 18:03
动态代理老是忘,偏偏这玩意还阴魂不散,Struts2里有,mybatis里有,Spring的aop更是以动态代理为主要实现,所以写一篇备忘,还加了一点spring的内容
interface Cal{int add(int i,int j);}//接口class jisuan implements Cal{int add(i,j){return i+j;}}//实现接口
实现InvocationHandler:
public class ProxyDemo implements InvocationHandler{ public Cal cal; public ProxyDemo(Cal cal) { this.cal=cal; } public Object invoke(Object proxy/*在其上调用方法的代理实例,也就是生成的com.sun.proxy.$Proxy0类*/, Method method/*在代理实例上调用的接口方法的 Method实例*/, Object[] args) throws Throwable { System.out.println("计算"+args[0]+"+"+args[1]); Object obj=null; try{ //@Before obj=method.invoke(cal,args);//反射,传入代理对象cal和参数列表args //@AfterRunning }catch(Exception e){ @AfterThrowing } //@After,因为可能产生异常,所以获取不到方法返回值 System.out.println("结果为:"+obj); return obj;//返回值为执行结果返回值,若为void则返回null }}
执行调用:
Jisuan j=new Jisuan();InvocationHandler handler=new ProxyDemo(j);Cal j2 =(Cal)Proxy.newProxyInstance(j.getClass().getClassLoader(),j.getClass().getInterfaces(), handler);int result=j2.add(1,1);//实际上相当于执行了ProxyDemo里的invoke方法System.out.println(result);
动态代理首先必须有个接口或者父类,比如Cal,因为实际上代理类(名字叫com.sun.proxy.$Proxy0)相当于拓展了Cal并重写了add方法,并类似这样实现:
class $Proxy0 implements Cal{ int add(i,j){ System.out.println("计算"+i+"+"+j); int result=i+j; System.out.println("结果为:"+result); return result; }}
*动态代理作用于Cal里所有方法,甚至是toString()
0 0
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- ZeroNet介绍
- SDH的基本概念
- 可视化利器 —— t-SNE(matlab toolbox 的使用与解释)
- 1002 Caffe Model Zoo
- 设计模式之代理模式
- 动态代理
- 论Android中关于如何保存activity的状态,以及保存的数据如何取出的方式
- Fourth records of career
- 总结——调试STM32F103ZET6及外围传感器_PM2.5传感器
- JAVA网络编程总结
- linux下安编译安装redis
- 开源库【FreeRadioGroup】--淡出、自由拖动、自动贴边,类似于苹果的虚拟辅助按钮
- 对于泛素化,你了解多少?
- Java注解(3)-源码级框架