[摘錄](méi)動(dòng)態(tài)代理
摘錄地址:http://jamesby.javaeye.com/blog/71036用Spring大概有3個(gè)月,一直都是張口AOP,閉口AOP,但是Spring的AOP具體是怎么實(shí)現(xiàn)的,現(xiàn)在也不是十分清楚.
只知道可以用JDK的動(dòng)態(tài)代理,基于接口,或者是cglib方式字節(jié)碼增強(qiáng).目前對(duì)JDK的動(dòng)態(tài)代理方式不是很理解,固拿出來(lái)探討下,我知道這應(yīng)該是個(gè)新手貼,但還是請(qǐng)大家給點(diǎn)意見.如果真正理解了動(dòng)態(tài)代理,那么對(duì)基于Spring AOP出現(xiàn)的各種現(xiàn)象就比較容易理解了.
先貼上一段代碼.
代碼
- package com.jamesby.proxy;
- public interface CarCompany {
- public void makeCar();
- public void abc();
- }
- package com.jamesby.proxy;
- public class CarCompanyImpl implements CarCompany {
- public void makeCar() {
- System.out.println("Company A make a car!");
- abc();
- }
- public void abc()
- {
- System.out.println("abc is invoked!");
- }
- }
- package com.jamesby.proxy;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public class CarCompanyHandler implements InvocationHandler {
- CarCompany com;
- //構(gòu)造時(shí)將被代理類綁定到Handler
- public CarCompanyHandler(CarCompany com) {
- this.com = com;
- }
-
- /**相當(dāng)于要把代理類的執(zhí)行方法重新包裝
- *proxy:被代理類
- *method:被代理類要執(zhí)行的方法
- *args:被代理類要執(zhí)行的方法時(shí)需要的參數(shù)
- **/
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- System.out.println("time1:" + System.currentTimeMillis());
- method.invoke(this.com, new Class[] {});
- System.out.println("time2:" + System.currentTimeMillis());
- return null;
- }
- }
- package com.jamesby.proxy;
- import java.lang.reflect.Proxy;
- public class Test {
- public static void main(String[] arg) {
- CarCompanyImpl a = new CarCompanyImpl();
- //將被代理類綁定到handler
- CarCompanyHandler handler = new CarCompanyHandler(a);
- // 產(chǎn)生一個(gè)新的代理類 ,將handler綁定到代理類中
- CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
- .getClassLoader(), new Class[] { CarCompany.class }, handler);
- com.makeCar();
- }
- }
|
|
歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人
posted on 2006-06-01 11:20 見酒就暈 閱讀(92) 評(píng)論(0) 編輯 收藏 所屬分類: J2EE文章