自学内容网 自学内容网

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)!