动态代理

为什么要使用动态代理

动态代理的作用就是将Proxy类的代码量固定下来,不会因为被代理类的业务逐渐增大而增大。

package com.example.demo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @program: demo
 * @description: 代理类
 * @author: lxd
 * @create: 2020-05-06 10:07
 **/
public class MyInvocationHandler implements InvocationHandler {
    private T object;

    public MyInvocationHandler(T object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法執行前-----");
        Object result = method.invoke(object, args);
        System.out.println("方法執行后-----");
        return result;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
    }

    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        MyInvocationHandler handler = new MyInvocationHandler(userService);
        UserService proxy = (UserService) handler.getProxy();
        proxy.add();

        RoleService roleService = new RoleServiceImpl();
        MyInvocationHandler handler1 = new MyInvocationHandler(roleService);
        RoleService roleProxy = (RoleService) handler1.getProxy();
        roleProxy.addRole();
    }
}

实际上,Spring的AOP和AspectJ就是基于动态代理技术实现的,而且它们能在配置文件中设置一些信息使代理更好用,更灵活。这也是Spring为什么这么受欢迎的原因之一,用SpringAOP代替JDK动态代理,让面向切面编程更容易实现。

现在Java的动态代理主要分为Java自己提供的JDK动态代理和CGLib(Code Generation Library)。JDK动态代理只能代理接口类,而CGLib这种则是直接修改字节码。

你可能感兴趣的:(动态代理)