Java动态代理

本文详细介绍了如何使用Java的动态代理机制,包括创建代理类、实现InvocationHandler接口、使用Proxy类的newProxyInstance方法,以及自定义处理器来增强UserService的功能。通过UserServiceImplTest2示例展示了如何在测试中使用这些技术。
摘要由CSDN通过智能技术生成

动态代理:
代理程序中某个类中的功能,为该功能进行增强

动态代理实现步步骤:
1.补代理类,必须要有实现接口
2.创建被代理对象,交给代理对象使用

动态代理的实现

  • JDK已经提供了现在的代理对象的 生成
    • Proxy 类
      静态方法:newProxyInstance(类加载器,接口数组,处理器)
package javaseproxy.demo1;

import org.junit.Test;

import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;

//处理器
class MyInvocationHandler implements InvocationHandler{
    private UserService userService;

    public MyInvocationHandler(UserService userService) {
        this.userService = userService;
    }

    public MyInvocationHandler() {
    }

    /**
     *
     * @param proxy     代理对象(不使用)
     * @param method    方法对象(被代理类所书写的每一个成员方法)
     * @param args      成员方法中的参数
     * @return          方法方法执行后的结果
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method);
        //记录开始时间
        long beginTime=System.currentTimeMillis();

        //使用Method对象,执行原有方法(被代理)功能
        Object result =method.invoke(userService,args);

        //记录结束时间
        long endTime=System.currentTimeMillis();
        System.out.println("findAllUser执行消耗"+(endTime-beginTime)+"秒");
        return result;
    }
}
public class UserServiceImplTest2 {
    @Test
    public void testProxy(){
        //前置:UserServiceImpl 有实现接口
        //创建:被代理对象
        UserService userService = new UserServiceImpl();

        //被代理所实现的所有接口
        //Class[] interfaces={ UserService.class};
        //注意,当一个类实现的接口比较多量,使用以上的方式,书写代码就繁琐了
        //简代代码: 获取被代理类对象的Class对象,基于Class类获取所有的实现接口
        Class[] interfaces=userService.getClass().getInterfaces();

        //使用JDK提供的Proxy代理对象
        UserService proxyObj = (UserService) Proxy.newProxyInstance(
                //参数1:类加载
                userService.getClass().getClassLoader(),
                //参数2:接口数组(被代理类所实现的所有接口
                userService.getClass().getInterfaces(),
                //参数3:处理器(关键)
                new MyInvocationHandler(userService)
        );
        //使用代理对象,调用方法
        List<User> allUser = proxyObj.findAllUser();
        for (User user:allUser){
            System.out.println(user);
        }
        //proxyObj.deleteUserById(1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值