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