1、使用JDK动态代理,使用Proxy类里面的方法创建代理对象
①调用newProxyInstance方法
该方法有三个参数:
第一个参数,类加载器
第二个参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三个参数,实现这个接口InvocationHandler,创建代理对象,写增强的部分
2、编写JDK动态代理代码
①创建接口,定义方法
②创建接口实现类,实现方法
③使用Proxy类创建接口代理对象
JDKProxy类的代码
package com.atguigu.spring5;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
* @author Dxkstart
* @create 2021-10-26-19:29
*/
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 result = dao.add(1, 2);//执行add方法增强逻辑后的方法
// System.out.println("result:" + result);
System.out.println(dao.update("12"));//执行update方法增强逻辑后的方法
}
}
//创建代理对象的代码
class UserDaoProxy implements InvocationHandler{
//1.创建的是谁的代理对象,就需要把谁传递过来(这里创建的是UserDaoImpl的代理对象)
//通过有参构造进行传递
private UserDaoImpl userDaoImpl;
public UserDaoProxy(UserDaoImpl userDaoImpl){
this.userDaoImpl = userDaoImpl;
}
//在invoke中写需要增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前的逻辑
System.out.println("方法之前执行~" + method.getName() + ":传递的参数是:" + Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(userDaoImpl, args);
//方法之后的逻辑
if (method.getName().equals("add")){
System.out.println("add方法之后执行~" + userDaoImpl);
}else {
System.out.println("执行update方法之后的逻辑");
}
return res;
}
}