java动态代理学习笔记
转:http://langyu.iteye.com/blog/410071
关键字: proxy invocationhandler 动态代理 原理?
--------------------分隔线-----------------------------?
引用网上的一个例子来说明问题(有部分改动,转载自:http://callan.iteye.com/blog/161806)?
真实的接口:?
Java代码??
- public?interface?Hello?{??
- ??
- ????void?sayHello(String?to);??
- ????
- ????void?print(String?p);???
- ???
- }??
它的真实实现类:?
Java代码??

- public?class?HelloImpl?implements?Hello?{??
- ??????
- ????public?void?sayHello(String?to)?{??
- ????????System.out.println("Say?hello?to?"?+?to);??
- ????}??
- ??????
- ????public?void?print(String?s)?{??
- ????????System.out.println("print?:?"?+?s);??
- ????}??
- ??????
- }??
在这里生成与代理类相关联的InvocationHandler对象?
Java代码??

- public?class?LogHandler?implements?InvocationHandler?{??
- ??????
- ????private?Object?dele;??
- ??????
- ????public?LogHandler(Object?obj)?{??
- ????????this.dele?=?obj;??
- ????}??
- ??????
- ????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{??
- ????????doBefore();??
- ????????//在这里完全可以把下面这句注释掉,而做一些其它的事情??
- ????????Object?result?=?method.invoke(dele,?args);??
- ????????after();??
- ????????return?result;??
- ????}??
- ??????
- ????private?void?doBefore()?{??
- ????????System.out.println("before....");??
- ????}??
- ??????
- ????private?void?after()?{??
- ????????System.out.println("after....");??
- ????}??
- }??
最后是测试类:?
Java代码??

- public?class?ProxyTest?{??
- ??
- ????public?static?void?main(String[]?args)?{??
- ????????HelloImpl?impl?=?new?HelloImpl();??
- ????????LogHandler?handler?=?new?LogHandler(impl);??
- ????????//这里把handler与impl新生成的代理类相关联??
- ????????Hello?hello?=?(Hello)?Proxy.newProxyInstance(impl.getClass().getClassLoader(),?impl.getClass().getInterfaces(),?handler);??
- ??????????
- ????????//这里无论访问哪个方法,都是会把请求转发到handler.invoke??
- ????????hello.print("All?the?test");??
- ????????hello.sayHello("Denny");??
- ????}??
- ??
- }??
这里是输出结果:?
Java代码??

- before....??
- print?:?All?the?test??
- after....??
- before....??
- Say?hello?to?Denny??
- after....??
--------------------分隔线-----------------------------?
最后试着来回答之前提出的问题:?
1.什么是动态代理??
一种用于转发请求,进行特殊处理的机制,“动态”应该指的是“运行期”。?
2.为什么使用动态代理??
可以对请求进行任何处理(如事务,日志等,这都是网上说的,我当然可以做任何处理)?
3.使用它有哪些好处??
如上?
4.哪些地方需要动态代理??
不允许直接访问某些类;对访问要做特殊处理等,我只能想到这些。?
--------------------分隔线-----------------------------?
其它一些想法:?
1.如果想声明产生B类的代理类,那个B类必须要实现接口,如果没有接口,?
代理类就不能伪装成B类的“兄弟”,也就没有存在的意思,?
其实也可以伪装成B类的“孩子”,对外他们有共同的接口,可以这样做吧??
2.当请求代理类的方法时,这个请求会被转到执行与代理类关联InvocationHandler?
的invoke方法。那InvocationHandler到底是什么?对它的理解可以是这样:?
它用来处理方法的调用,实现类也有同样的意义;与代理类对象相关联则表示,?
它就是负责处理代理类应该有的动作,把所有的方法请求分发到invoke这个方法上。?
--------------------分隔线-----------------------------?
学习后总结,既可以全面地观察分析,又能加深印象。?
如果我的理解有误,别人的指证会对我产生积极影响。?
如果我的理解正确,帮助其它人理解是我的荣幸。?
初学者,请多多指教。