1.基于jdk动态代理

①建立代理对象和真实对象的关系
②实现代理逻辑方法

待实现接口

  1. /**
  2. * @author 10242026
  3. * @date 2019/9/20
  4. * @Description
  5. * @TODO
  6. */
  7. public interface IHello {
  8. /**
  9. * sayHello
  10. */
  11. void sayHello();
  12. }

接口的实现类(被代理类)

  1. /**
  2. * @author 10242026
  3. * @date 2019/9/20
  4. * @Description
  5. * @TODO
  6. */
  7. public class HelloImpl implements IHello {
  8. @Override
  9. public void sayHello() {
  10. System.out.println("这是被代理对象的方法");
  11. }
  12. }

动态代理绑定和代理逻辑实现

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. /**
  5. * @author 10242026
  6. * @date 2019/9/20
  7. * @Description
  8. * @TODO
  9. */
  10. public class JdkProxyExample implements InvocationHandler {
  11. /**
  12. * 真实对象(被代理对象)
  13. */
  14. private Object target = null;
  15. /**
  16. * 利用真实对象构建代理对象
  17. * @param target
  18. * @return
  19. */
  20. public Object bind(Object target) {
  21. this.target = target;
  22. //代理类利用哪个类加载器进行类的加载 代理类实现的是哪个接口 实现InvocationHandler的类(类中的invoke函数进行被代理类方法的改写),此处该类就实现了InvocationHandler的类
  23. return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
  24. }
  25. /**
  26. * 改写被代理类的方法
  27. * @param proxy 代理对象(bind方法生成的对象)
  28. * @param method 当前调度的方法 bind生成的对象调用的方法(bind会生成一个代理类对象,然后指定调用哪个方法,这个method的值就是proxy调用的方法)
  29. * @param args 真实对象中被调用方法的形参
  30. * @return
  31. * @throws Throwable
  32. */
  33. @Override
  34. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  35. System.out.println("进入代理逻辑方法");
  36. System.out.println("调用真实对象之前的服务");
  37. //通过反射调用被代理类的方法
  38. Object obj = method.invoke(target, args);
  39. System.out.println("调用真实对象之后的服务");
  40. return obj;
  41. }
  42. }

代理类测试

  1. import com.zte.cn.mybatis.service.HelloImpl;
  2. import com.zte.cn.mybatis.service.IHello;
  3. /**
  4. * @author 10242026
  5. * @date 2019/9/20
  6. * @Description
  7. * @TODO
  8. */
  9. public class TestJdkProxy {
  10. public static void main(String[] args) {
  11. HelloImpl hello = new HelloImpl();
  12. JdkProxyExample example = new JdkProxyExample();
  13. IHello proxy = (IHello) example.bind(hello);
  14. proxy.sayHello();
  15. }
  16. }

2.基于cglib实现动态代理

  1. import org.springframework.cglib.proxy.Enhancer;
  2. import org.springframework.cglib.proxy.MethodInterceptor;
  3. import org.springframework.cglib.proxy.MethodProxy;
  4. import java.lang.reflect.Method;
  5. /**
  6. * @author 10242026
  7. * @date 2019/9/20
  8. * @Description
  9. * @TODO
  10. */
  11. public class CglibProxyExample implements MethodInterceptor {
  12. /**
  13. * 生成cglib代理对象
  14. * @param clazz Class类 被代理类的Class
  15. * @return 被代理的Class的cglib代理对象
  16. */
  17. public Object getProxy(Class clazz) {
  18. //cglib增强类对象
  19. Enhancer enhancer = new Enhancer();
  20. //设置增强类型
  21. enhancer.setSuperclass(clazz);
  22. //定义代理逻辑对象,代理逻辑对象需实现MethodInterceptor方法,本例就是当前对象
  23. enhancer.setCallback(this);
  24. //生成并返回代理对象
  25. return enhancer.create();
  26. }
  27. /**
  28. * 代理类中被调方法的逻辑实现
  29. * @param o 代理对象 getProxy中的返回值
  30. * @param method 被调方法
  31. * @param objects 被调方法的形参
  32. * @param methodProxy 方法代理
  33. * @return 代理逻辑返回
  34. * @throws Throwable
  35. */
  36. @Override
  37. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  38. System.out.println("被调真实对象前");
  39. Object ret = methodProxy.invokeSuper(methodProxy, objects);
  40. System.out.println("调用真实对象后");
  41. return ret;
  42. }
  43. }

测试

  1. /**
  2. * @author 10242026
  3. * @date 2019/9/20
  4. * @Description
  5. * @TODO
  6. */
  7. public class TestCglibProxy {
  8. public static void main(String[] args) {
  9. CglibProxyExample example = new CglibProxyExample();
  10. Object obj = example.getProxy(HelloImpl.class);
  11. HelloImpl proxy = (HelloImpl) obj;
  12. proxy.sayHello();
  13. }
  14. }