一. 用cglib 实现java 的動態代理
用cglib 實現的動態代理,被代理的目标是一个普通的类,并不像jdk动态代理那样必須實現一個接口才可以.其實現主是通過net.sf.cglib.proxy.MethodInterceptor接口,即可完成对目标对象的代理;
二. 首先在classpath下導入動態代理所依賴的jar包:cglib-nodep-2.1_3.jar(見附件)
二. 本章用'售票點代理車站售票'的示例來演示如何用cglib来實現对java的動態代理.完整代碼如下:
1. 被代理目標类
package structuralPattern.proxy.cglib;
/**
* @ClassName: TrainStation
* @Description:目标代理类
* @author Liyongbin
* @date 2011-2-9 上午09:59:37
* @version V1.0
*/
public class TrainStation {
public void saleTicet(){
System.out.println("卖火车票");
}
}
2. 動態代理类
package structuralPattern.proxy.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @ClassName: DynamicProxy_cglib
* @Description:動態代理类
* @author Liyongbin
* @date 2011-2-9 上午10:21:33
* @version V1.0
*/
public class DynamicProxy_cglib implements MethodInterceptor {
private Object target;
public Object getProxy(Object targetObject) {
this.target = targetObject;
Enhancer proxy = new Enhancer();
proxy.setSuperclass(target.getClass());
proxy.setCallback(this);
return proxy.create();
}
@Override
public Object intercept(Object proxyObject, Method proxyMethod,
Object[] paramArray, MethodProxy methodsProxy) throws Throwable {
deliverTicket();
Object proxy = proxyMethod.invoke(target, paramArray);
discountTicket();
return proxy;
}
// "代理"自己的方法1
public void deliverTicket() {
System.out.println("送票上門服務");
}
// "代理"自己的方法2
public void discountTicket() {
System.out.println("買票打折服務");
}
}
3. 測試動態代理
package structuralPattern.proxy.cglib;
/**
* @ClassName: DynamicProxyTest
* @Description:測試動態代理
* @author Liyongbin
* @date 2011-2-9 上午09:59:15
* @version V1.0
*/
public class DynamicProxyTest {
public static void main(String[] args) {
DynamicProxy_cglib proxy = new DynamicProxy_cglib();
TrainStation ts = (TrainStation)proxy.getProxy(new TrainStation());
ts.saleTicet();
}
}
4. 測試結果如下:
送票上門服務
卖火车票
買票打折服務