天天看點

[Spring]基于AOP使用JDK動态代理[底層原理]

底層原理:

[Spring]基于AOP使用JDK動态代理[底層原理]

1.建立接口

package test;

//1.建立接口,定義方法
public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}

           

2.被代理類實作接口

package test;

//2.被代理類,實作接口
public class UserDaoImpl implements  UserDao{
    @Override
    public int add(int a, int b) {
        System.out.println("add方法執行l......");
        return a+b;
    }

    @Override
    public String update(String id) {
        System.out.println("update方法執行l......");
        return id;
    }
}

           

3.代理類實作動态代理

package test;

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(), interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return null;
            }
        })*/

        UserDaoImpl userDao=new UserDaoImpl();
        //UserDaoProxy類中,需要接受一個被代理類對象
        Object obj=Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));
        //newProxyInstance方法傳回Object類型
         UserDao dao=(UserDao) obj;
         int result=dao.add(1,2);
         System.out.println("result:"+result);
    }
}
//建立代理對象代碼
class UserDaoProxy implements InvocationHandler{

    private Object obj;//實作了接口的被代理類的對象的聲明
//1.給被代理的對象執行個體化2.傳回一個代理類的對象
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;
    }
}

           

運作結果如圖:

[Spring]基于AOP使用JDK動态代理[底層原理]

具體可參照[Java]靜态代理、動态代理、AOP程式設計代碼執行個體:僅僅是形式上發生了變化

https://blog.csdn.net/mmmm0584/article/details/114667324