AOP-底層原理(JDK動態代理實現)
阿新 • • 發佈:2021-11-30
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; } }