1. 程式人生 > 實用技巧 >Spring-AOP-AOP底層原理-JDK動態代理demo

Spring-AOP-AOP底層原理-JDK動態代理demo

JDK動態代理

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

java.lang.reflect.Proxy

newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

ClassLoader loader:類載入器

Class<?>[] interfaces:增強方法所在類,這個類實現的介面,支援多個介面

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

2.JDK動態代理demo

1.建立介面,定義方法

package com.orzjiangxiaoyu.aop.test1;

/**
 * @author orz
 * @create 2020-08-17 16:15
 */
public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}

2.建立介面實現類,實現方法

package com.orzjiangxiaoyu.aop.test1;

/**
 * @author orz
 * @create 2020-08-17 16:16
 */
public
class UserDaoImpl implements UserDao { @Override public int add(int a, int b) { System.out.println("被增強的方法add"); return a+b; } @Override public String update(String id) { System.out.println("被增強的方法update"); return id; } }

3.使用Proxy建立代理物件

package com.orzjiangxiaoyu.aop.test1;

import java.lang.reflect.Array;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author orz
 * @create 2020-08-17 16:17
 */
public class JDKProxyTest {
    public static void main(String[] args) {

        Class[] intefaces={UserDao.class};
        UserDaoImpl userDao=new UserDaoImpl();
        //建立介面實現類的代理物件
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxyTest.class.getClassLoader(), intefaces, new UserDaoProxy(userDao));
        dao.add(1,2);
        //dao.update("jack");
    }
}

//建立代理物件程式碼
class UserDaoProxy implements InvocationHandler {

    //1.把建立的是誰的代理物件,把誰傳遞過來
    //有引數構造器傳遞

    private Object obj;
    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;

    }
}

測試結果

方法之前執行...add傳遞的引數:[1, 2]
被增強的方法add
方法之後執行...com.orzjiangxiaoyu.aop.test1.UserDaoImpl@51efea79