目前動(dòng)態(tài)代理主要有兩種形式,jdk和cglib代理寻行,其中動(dòng)態(tài)代理是基于接口的代理媚创,而cglib是基于類的動(dòng)態(tài)代理。下邊就簡單寫兩個(gè)示例來簡單說一下這兩個(gè)代理:
jdk動(dòng)態(tài)代理
先定義一個(gè)接口,主接口
public interface Subject {
void request();
}
緊接著我們來定義一個(gè)java類來實(shí)現(xiàn)這個(gè)接口
public class RequestSubject implements Subject {
@Override
public void request() {
System.out.println("------主題類----------");
}
}
以上是被代理的接口和實(shí)現(xiàn)類,那么現(xiàn)在我們開始寫代理類膝藕,在被代理的類前后帶引一些語句,如下
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyDymic implements InvocationHandler{
private Subject sub;
public ProxyDymic(Subject sub){
this.sub=sub;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("------開始代理---------");
Object result=method.invoke(sub, args);
System.out.println("------代理結(jié)束---------");
return result;
}
}
緊接著我們來寫測試類,看看效果
import java.lang.reflect.Proxy;
/**
* 動(dòng)態(tài)代理測試
*
* @author scorpion
*
*/
public class ProxyTest {
public static void main(String[] args) {
// 創(chuàng)建委托對(duì)象
RequestSubject sub = new RequestSubject();
// 創(chuàng)建調(diào)用處理器對(duì)象
ProxyDymic dymic = new ProxyDymic(sub);
//動(dòng)態(tài)生成代理對(duì)象
Subject subProxy = (Subject) Proxy.newProxyInstance(RequestSubject.class.getClassLoader(),
RequestSubject.class.getInterfaces(), dymic);
//通過代理對(duì)象調(diào)用方法
subProxy.request();
}
}
輸出結(jié)果如下:
------開始代理---------
------主題類----------
------代理結(jié)束---------
這里有些需要特別注意的點(diǎn),首先必須是接口類续誉,其次是我們的代理方法必須要實(shí)現(xiàn)invocationHandler,并且要重寫里邊的方法初肉,在這個(gè)方法里對(duì)被代理類進(jìn)行修飾或者是限制酷鸦。
cglib代理
先上代碼,緊接著我們?cè)趤斫忉?br> 首先要定義父類
public class Programer {
public Programer(){}
public void say(){
System.out.println("我是一個(gè)程序員牙咏,我負(fù)責(zé)編程");
}
}
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Hacker implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("hacker代理開始臼隔。。眠寿。躬翁。焦蘑。盯拱。。例嘱。");
proxy.invokeSuper(obj, args);
System.out.println("hacker代理結(jié)束狡逢。。拼卵。奢浑。。腋腮。雀彼。。");
return null;
}
}
測試類
import net.sf.cglib.proxy.Enhancer;
public class CGLibTest {
public static void main(String[] args) {
Programer p=new Programer();
Hacker h=new Hacker();
Enhancer en=new Enhancer();
en.setSuperclass(p.getClass());
en.setCallback(h);
Programer proxy=(Programer)en.create();
proxy.say();
}
}
我們仔細(xì)看即寡,首先cglib是實(shí)現(xiàn)了對(duì)類的代理徊哑,另外我們的代理類必須是要實(shí)現(xiàn)MethodInterceptor,并且要重寫里邊的方法聪富,此外這里有個(gè)非常重要的類需要引起注意Enhancer類莺丑,它是鏈接唄代理類和代理類的橋梁,沒有它我們的代理就無法執(zhí)行墩蔓。
好了梢莽,這次就先介紹到這里,后邊會(huì)不上這些類的具體實(shí)現(xiàn)奸披,以及其背后的原理昏名。敬請(qǐng)期待。阵面。轻局。份殿。。嗽交。