Java动态代理

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

动态代理实现步步骤:
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);
    }
}

你可能感兴趣的:(Java,java)