介绍
我们知道JDK的动态代理应用到很多地方,最常见的是Spring 框架里面的AOP思想,用的就是JDK的动态代理,当然实现动态代理还有其他的方法,例如CGLIB,本文主要是简单实现JDK的动态代理的原理与过程!
首先我们需要创建一个接口和一个接口实现类。例如UserDao接口和其实现类UserDaoImpl。我们都知道JDK的动态代理可以帮我们将某一个模块在不改变原有的逻辑基础之上,新增一些功能,比如简单的登录功能,如果我们需要在登录成功后对用户进行一个权限的判断,那么我们可以不用改变之前的逻辑,使用动态代理的方式,帮助我们的登录操作在成功之后进行权限认证。话不多说,直接上代码!
public interface UserDao {
int add(int a, int b);
String update(String id);
}
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
System.out.println("开始调用add方法了...");
return a + b;
}
@Override
public String update(String id) {
System.out.println("开始调用update方法了...");
return id;
}
}
public class JDKProxy {
public static void main(String [] args) {
Class[] interfances = {UserDao.class};
UserDaoImpl userDao = new UserDaoImpl();
UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),
interfances, new UserDaoProxy(userDao));
int result = dao.add(4, 5);
System.out.println("输入结果"+result);
}
}
/**
* 创建对象的代理对象
*/
class UserDaoProxy implements InvocationHandler{
private Object obj;
// 创建谁的代理对象,就需要将这个谁传递过来,如果需要创建UserDaoImpl的代理的对象,就需要将UserDaoImpl对象传递过来
public UserDaoProxy(Object obj) {
this.obj = obj;
}
/**
* 方法增强的逻辑
* @param proxy
* @param method
* @param args
* @author greatWin(wangwei)
* @date 2022/1/12 14:05
* @return java.lang.Object
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法之前开始执行了..."+method.getName()+" 方法传递的参数" + Arrays.toString(args));
// 执行被增强的方法
Object invoke = method.invoke(obj, args);
System.out.println("方法之后开始执行了"+ obj);
return invoke;
}
}