1. 程式人生 > 其它 >AOP-底層原理(JDK動態代理實現)

AOP-底層原理(JDK動態代理實現)

1.使用JDK動態代理,使用Proxy類裡面的方法建立代理物件

    

  (1)呼叫newProxyInstance方法

  方法有三個引數:

    第一個引數:ClassLoader 類載入器

    第二個引數:增強方法所在的類,這個類實現的介面,支援多個介面

    第三個引數:實現這個介面InvocationHandler,建立代理物件,寫增強的方法

2.編寫JDK動態代理程式碼

   (1)建立介面,定義方法

public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}

   (2)建立介面實現類,實現方法

public class UserDaoImpl implements UserDao{
    @Override
    public int add(int a, int b) {
        return a+b;
    }

    @Override
    public String update(String id) {
        return id;
    }
}

  (3)使用Proxy類建立介面代理物件

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import java.util.Arrays; public class JDKProxy { public static void main(String[] args) { //建立介面實現類代理物件 Class[] interfaces = {UserDao.class}; // Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interface,new InvocationHandler() { // @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // return null; // } // }); UserDaoImpl userDao = new UserDaoImpl(); UserDao dao =(UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao)); int result = dao.add(1, 2); System.out.println("result:"+result); } } //建立代理物件程式碼 class UserDaoProxy implements InvocationHandler{ //1 把建立的是誰的代理物件,把誰傳遞過來 //有參構造傳遞 private Object obj; public UserDaoProxy(Object obj){ this.obj=obj; } //增強的邏輯 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法之前 System.out.println("方法之前執行...."+method.getName()+":傳遞的引數..."+ Arrays.toString(args)); //被增強的方法執行 Object res = method.invoke(obj, args); //方法之後 System.out.println("方法之後執行"+obj); return res; } }