AOP(jDK动态代理)

1.使用JDK动态代理,使用Proxy类里面的方法

(1)调用newProxyInstance方法

方法由三个参数

(1)第一个参数,类加载器

(2)第二个参数,被代理类实现的接口(数组形式可以多个)

(3)第三个参数,实现这个接口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类创建接口代理对象

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();
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));
        int res = dao.add(1,2);
        System.out.println(res);
    }
}


//创建代理对象代码
class  UserDaoProxy implements InvocationHandler{
//    1.把创建的是谁的代理对象,把谁传递过来
//    有参数构造传递
    private Object obj;
    public UserDaoProxy(Object object){
        this.obj = object;
    }
    //增加的逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        方法之前做个处理
        System.out.println("方法之前执行。。。。"+method.getName()+":传递的参数"+Arrays.toString(args)+args[0]);
//        被增强的方法执行
        Object res = method.invoke(obj,args);

//        方法之后做个处理
        System.out.println("在方法之后执行");
        return res;
    }
}


版权声明:本文为weixin_46543456原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。