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{
@Override
public void login(String userName, String password) {
if(userName.equals("Rem") && password.equals("5201314")){
System.out.println("登陆成功,欢迎您蕾姆~");
}
}
@Override
public 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 方法执行过程中抛出的异常
*/
@Override
public 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. 实现结果
二、参考资料
三、后记
- 最近在看动态代理相关的教程,写了一个demo,分享给大家,后续还会更新更深层次的Java动态代理解析。
- 要是文章对您有帮助,欢迎点赞、收藏、评论、关注!
原文地址:https://blog.csdn.net/cxcxrs/article/details/143079202
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!