欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > Java动态代理 | 代码实现Demo

Java动态代理 | 代码实现Demo

2025/5/8 23:42:40 来源:https://blog.csdn.net/cxcxrs/article/details/143079202  浏览:    关键词:Java动态代理 | 代码实现Demo

一、代码实现

1. 编写UserService接口

import java.util.List;public interface UserService {/*** 登录*/void login(String userName, String password);/*** 查询用户列表*/List<String> getUserList();
}

2. 编写UserService接口实现类

import java.util.Arrays;
import java.util.List;public class UserServiceImpl implements UserService{@Overridepublic void login(String userName, String password) {if(userName.equals("Rem") && password.equals("5201314")){System.out.println("登陆成功,欢迎您蕾姆~");}}@Overridepublic List<String> getUserList() {List<String> users = Arrays.asList("蕾姆", "雪乃","三玖", "藤原千花");System.out.println("查询到的用户是:" + users);return users;}
}

3. 编写代理工具类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 代理工具类*/
public class ProxyUtils {/*** 创建UserService的代理实例* 该方法用于生成UserService接口的代理对象,以便在调用特定方法时添加额外的逻辑** @param userService UserService接口的实现对象* @return UserService接口的代理对象*/public static UserService createProxy(UserService userService) {/*创建UserService的代理实例参数1:当前代理工具类的类加载器参数2:代理对象需要实现的接口,这里是 UserService参数3:定义代理对象的方法调用逻辑*/UserService userServiceProxy = (UserService) Proxy.newProxyInstance(ProxyUtils.class.getClassLoader(),new Class[]{UserService.class},new InvocationHandler() {/*** 方法调用的代理逻辑* 当调用代理对象的方法时,该方法会被调用* 在这里可以添加额外的逻辑,比如方法执行时间的统计** @param proxy 代理类实例* @param method 被调用的方法对象* @param args 方法参数* @return 方法的返回值* @throws Throwable 方法执行过程中抛出的异常*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 对特定方法名进行判断,以决定是否统计方法执行时间if (method.getName().equals("login") || method.getName().equals("getUserList")) {long startTime = System.currentTimeMillis();// 执行方法Object res = method.invoke(userService, args);long endTime = System.currentTimeMillis();System.out.println(method.getName() + "方法执行时间为:" + (endTime - startTime)/1000.0 + "s")  ;return res;} else {// 执行方法return method.invoke(userService, args);}}});return userServiceProxy;}
}

4. 编写测试类

public class UserTest {public static void main(String[] args) {// 创建用户对象 (对象实现功能:执行方法逻辑)// UserService userService = new UserServiceImpl();// 创建用户代理对象 (代理对象实现功能:执行方法逻辑,并统计方法执行时间)UserService userService = ProxyUtils.createProxy(new UserServiceImpl());// 调用方法userService.login("Rem", "5201314");System.out.println("======================================");userService.getUserList();}
}

5. 实现结果

动态代理实现结果

二、参考资料

  • 【黑马磊哥】Java动态代理深入剖析,真正搞懂Java核心设计模式:代理设计模式

三、后记

  • 最近在看动态代理相关的教程,写了一个demo,分享给大家,后续还会更新更深层次的Java动态代理解析。
  • 要是文章对您有帮助,欢迎点赞、收藏、评论、关注!

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com