java的動態代理,jdk動態代理,一個Sping AOP的簡單實現

在靜態代理中,必須有已知的代理類,並且每一個類若是想要一個代理類的話都得從新寫,這樣的代碼量以及後期的維護量都太大了,爲了解決這個麻煩,咱們使用動態代理java

既然動態代理解決了靜態代理的麻煩,那麼必然的,咱們不須要爲每個類都寫一個代理類了,由於代理類是自動生成的。jdk的動態代理是基於接口的,因此,首先咱們仍是須要一個接口數組

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public interface Person {
    void getMsg(String name);
}

接着,目標類是必須的了。目標類要實現上述接口的ide

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public class SuperStar implements Person{
    //目標方法
    public void getMsg(String name){
        System.out.println("我叫"+ name +",我是個明星");
    }

}

接下來,咱們不須要本身再寫代理類了,可是咱們須要寫一箇中介類(目標類與代理類之間的中介類),不過不要擔憂,這個類咱們只要寫一次就夠了。測試

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public class Hanlder<T> implements InvocationHandler {
    //目標類
    private T t;

    public Hanlder(T t){
        this.t = t;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //目標方法執行前的一些代碼
        System.out.println("-------------before------------");
        System.out.println("方法名:" + method.getName());
        System.out.print("參數:");
        for (int i =0;i<args.length;i++){
            System.out.print(args[i]);
        }
        System.out.println();
        //執行目標方法
        Object result = method.invoke(t,args);
        //目標方法執行後的一些代碼
        System.out.println("返回值:" + result);
        System.out.println("-------------after------------");
        return result;
    }
}

接着,咱們來測試一下this

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * Created by lidongyang on 2017/8/21 0021.
 */
public class LockTest{

    public static void main(String[] args) {
        InvocationHandler handler = new Hanlder(new SuperStar());
        //生成代理類
        //第一個參數:代理類的類加載器
        //第二個參數:目標類實現的接口類數組
        //第三個參數:就是上面的hanlder
        Person person = (Person)Proxy.newProxyInstance(handler.getClass().getClassLoader(), 
                        new Class[]{Person.class}, handler);
        //經過代理類執行目標方法
        person.getMsg("林志玲");
    }
}

輸出爲.net

 

看到這裏,有沒有發現,這其實就是個Spring AOP的簡單實現代理

cglib動態代理地址:https://my.oschina.net/u/3410701/blog/edit/1518888blog

相關文章
相關標籤/搜索