java的動態代理中,jdk動態代理是基於接口的,也就是說,若是一個類想要經過代理被調用,那這個類必定要有實現的接口。而cglib動態代理是基於繼承的,這個並非說想要經過代理被調用的類必需要有一個父類,而是說,偏偏相反,此類不須要實現任何接口或繼承任何類。這裏說的基於繼承,指的是:cglib會自動生成一個此類的子類,並重寫此類的全部方法,從而達到代理的目的。因此一個類要想被cglib動態代理,那麼這個類必定不能是final的,方法也不能是final的。下面看例子java
首先咱們須要一個目標類,一個很普通的類,沒有接口,也沒有繼承測試
/** * Created by lidongyang on 2017/8/22 0022. */ public class SuperStar { public void getMsg(String name){ System.out.println("我叫" + name + ",我是一個明星"); } }
而後,咱們須要一個callback,這個類須要實現MethodInterceptor,而它又繼承了callback接口.net
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * Created by lidongyang on 2017/8/22 0022. */ public class Proxy implements MethodInterceptor { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("方法名稱是:" + method.getName()); System.out.print("參數是:"); for(int i =0 ;i<objects.length;i++){ System.out.print(objects[i]); } System.out.println(); System.out.println("-----------------before-------------------"); //注意這裏使用的是invokeSuper()方法,而不是invoke()方法,很重要!否則會死循環 Object result = methodProxy.invokeSuper(o,objects); System.out.println("-----------------after--------------------"); System.out.println("返回值是:" + result); return result; } }
下面是測試類代理
import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; /** * Created by lidongyang on 2017/8/22 0022. */ public class Test { public static void main(String[] args) { //經過Enhancer獲取代理類 Callback proxy = new Proxy(); Enhancer enhancer = new Enhancer(); //設置要代理的目標類 enhancer.setSuperclass(SuperStar.class); //設置callback enhancer.setCallback(proxy); //獲取代理類 SuperStar superStar = (SuperStar)enhancer.create(); //經過代理類來執行方法 superStar.getMsg("林志玲"); } }
輸出blog
讀到這裏,又是一個Spring AOP的簡單實現。繼承
jdk動態代理實現地址: http://www.javashuo.com/article/p-cewhubet-mu.html接口