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() {@Overridepublic 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中写需要增强的逻辑@Overridepublic 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;}}
