动态代理

动态代理实现 MethodInterceptor 他可以在使用时再确定要代理什么并且由使用者决定要调用的方法。本质上是使用了反射来实现的
  1. 定义一个接口
public interface IRegisterService {
    void register(String name, String pwd);
}
  1. 一个接口的实现类
public class RegisterServiceImpl implements IRegisterService {
    @Override
    public void register(String name, String pwd) {
        System.out.println(String.format("【向数据库中插入数据】name:%s,pwd:%s", name, pwd));
    }
}
  1. 一个实现了InvocationHandler接口的类

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

class InsertDataHandler implements InvocationHandler {

    // 持有一个被代理类的引用, 但是这个被代理类不是具体的类。而是超类
    Object obj;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        doBefore();
        // 在这里调用被代理的方法
        Object result = method.invoke(obj, args);
        doAfter();
        return result;
    }
    private void doBefore() {
        System.out.println("[Proxy]一些前置处理");
    }
    private void doAfter() {
        System.out.println("[Proxy]一些后置处理");
    }

}
  1. 测试
public class DynamicProxy {
    public static void main(String[] args) {
        // 实例化被代理类
        IRegisterService iRegisterService = new RegisterServiceImpl();

        // 实例化代理类
        InsertDataHandler insertDataHandler = new InsertDataHandler();

        // 通过Proxy获取代理类
        IRegisterService proxy = (IRegisterService)insertDataHandler.getProxy(iRegisterService);

        // 执行方法
        proxy.register("RyanLee", "123");
    }
}