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;
    }
}

 

posted @ 2021-11-30 20:52  Soleili  阅读(42)  评论(0编辑  收藏  举报