前面說到了java的動态代理,但是動态代理依賴于接口,這次來看看cglib來實作的代理...
假設有如下方法,這回沒有說接口哦~

package proxy.cglibProxy;
public class RealSubject2 {
public void request() {
System.out.println("request...");
}
public void response() {
System.out.println("response...");
}
}
View Code
然後,需求來了,希望在執行方法前後加某個其他的操作,這個類沒有實作任何接口啊,不能用動态代理了,隻好使用cglib了
那麼可以這麼做:

package proxy.cglibProxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 使用cglib動态代理
*
*
*/
public class CglibProxy implements MethodInterceptor {
private Object target;
/**
* 建立代理對象
*
* @param target
* @return
*/
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 回調方法
enhancer.setCallback(this);
// 建立代理對象
return enhancer.create();
}
// 回調方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("before...");
proxy.invokeSuper(obj, args);
System.out.println("afeter...");
return null;
}
}
然後用戶端代碼可以這麼寫:

package proxy.cglibProxy;
public class CglibTestMain {
public static void main(String[] args) {
CglibProxy cglib = new CglibProxy();
RealSubject2 subject = (RealSubject2) cglib.getInstance(new RealSubject2());
subject.request();
}
}
如果我們在上面的main方法裡面加一行:
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"c:\\cglib");
就可以看到編譯後的class,你會發現一個RealSubject2$$EnhancerByCGLIB$$d705369d.class
用反編譯工具打開看看你就明白了:(這裡推薦一個小巧的反編譯工具,點我下載下傳 )
public class RealSubject2$$EnhancerByCGLIB$$d705369d extends RealSubject2
implements Factory
{
......
}
也就是說,cglib其實通過修改位元組碼,給沒有實作接口的RealSubject2設定了一個繼承它的子類....
更多關于cglib的介紹可以看這裡:
http://blog.csdn.net/xiaohai0504/article/details/6832990
http://www.iteye.com/topic/799827