java的動態代理,cglib動態代理

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接口

相關文章
相關標籤/搜索