如上
package com.mxh.spring5;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
* @author MXHstrat
* @create 2021 - 11 - 28 16:46
*/
public class JDKProxy {
public static void main(String[] args) {
//1.创建接口实现类的 代理对象
Class[] interfaces = {UserDao.class};
UserDaoImpl userDao = new UserDaoImpl();//返回被代理对象的实例
UserDaoProxy userDaoProxy = new UserDaoProxy(userDao);//传入被代理对象的实例,对标代理对象代码中的有参构造方法
//2.调用newProxyInstance() 返回增强过后的UserDao接口实现类的对象 dao
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, userDaoProxy);
//操作dao中增强过后的add方法
int add = dao.add(1, 2);
System.out.println("add = " + add);
}
//2创建代理对象代码
static class UserDaoProxy implements InvocationHandler {
//2.1传入被代理类的对象
//s使用有参构造的方法传递
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//2.2重写invoke方法,并在此写入需要被增强的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("___________________");
//增强的逻辑之前执行的方法
System.out.println("方法" + method.getName() + ":传入的参数为:" + Arrays.toString(args));
//增强的逻辑
Object invoke = method.invoke(obj, args);
//增强的逻辑之后执行的方法
System.out.println("方法后执行:" + obj);
System.out.println("___________________");
return invoke;
}
}
}