前言

相关链接

  1. 创建一个接口 Subject
  2. 创建一个被代理的类 RealSubject 并实现 Subject接口
  3. 创建动态代理处理类 JdkInvocationHandler,并实现 InvocationHandler 接口,重写 invoke 方法
  4. 设置被代理接口并提供获取被被代理接口示例对象的方法
  5. 测试

    Subject 接口

    ```java package top.simba1949.jdk;

/**

  • @author Anthony
  • @date 2020/11/17 15:27 / public interface Subject { /*
    • doSomething方法
    • @return */ String doSomething(); } ```

      RealSubject 被代理的类

      ```java package top.simba1949.jdk;

/**

  • @author Anthony
  • @date 2020/11/17 15:28 */ public class RealSubject implements Subject{ @Override public String doSomething() {
    1. System.out.println("RealSubject doSomething");
    2. return "SUCCESS";
    } } ```

    JdkInvocationHandler 代理处理类

    ```java package top.simba1949.jdk;

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

/**

  • 代理处理类
  • @author Anthony
  • @date 2020/11/17 15:29 / public class JdkInvocationHandler implements InvocationHandler { /*

    • 被代理的类 */ private Subject target;

      public JdkInvocationHandler(Subject target) { this.target = target; }

      /**

    • invoke 方法
    • @param proxy 动态代理的类实例
    • @param method 调用的方法
    • @param args 调用方法的参数
    • @return
    • @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(“do something before”); // result 是被代理方法的返回值 Object result = method.invoke(target, args); System.out.println(“do something after”); return result; }

      /**

    • 获取被代理接口实例对象
    • @return */ public Subject getProxy(){ // 第一个参数是类加载器,用于加载这个代理类 // 第二个参数是Class数组,里面存放的是待实现的接口信息 // 第三个参数是InvocationHandler实例 return (Subject) Proxy.newProxyInstance(target.getClass().getClassLoader(),
      1. target.getClass().getInterfaces(), this);
      } } ```

      测试

      ```java package top.simba1949.jdk;

/**

  • jdk动态代理测试
  • @author Anthony
  • @date 2020/11/17 15:32 */ public class JdkInvocationHandlerApp { public static void main(String[] args) {
    1. // realSubject 被代理的类
    2. RealSubject realSubject = new RealSubject();
    3. Subject proxy = new JdkInvocationHandler().getProxy();
    4. proxy.doSomething();
    } } ```

    cglib动态代理

引入 cglib 包

cglib maven 地址:https://mvnrepository.com/artifact/cglib/cglib

  1. <!-- https://mvnrepository.com/artifact/cglib/cglib -->
  2. <dependency>
  3. <groupId>cglib</groupId>
  4. <artifactId>cglib</artifactId>
  5. <version>3.3.0</version>
  6. </dependency>

SubjectService 被代理类

  1. package top.simba1949.cglib;
  2. /**
  3. * @author Anthony
  4. * @date 2020/11/17 16:06
  5. */
  6. public class SubjectService {
  7. public String doSomething(String info){
  8. System.out.println("doSomething: " + info);
  9. return "SUCCESS";
  10. }
  11. }

代理处理类

  1. package top.simba1949.cglib;
  2. import net.sf.cglib.proxy.MethodInterceptor;
  3. import net.sf.cglib.proxy.MethodProxy;
  4. import java.lang.reflect.Method;
  5. /**
  6. * 代理处理类
  7. * @author Anthony
  8. * @date 2020/11/17 16:08
  9. */
  10. public class CglibMethodInterceptor implements MethodInterceptor {
  11. /**
  12. *
  13. * @param obj 表示增强的对象
  14. * @param method 表示被拦截的方法;
  15. * @param objects 表示被拦截方法的参数;
  16. * @param methodProxy 表示要触发父类的方法对象;
  17. * @return
  18. * @throws Throwable
  19. */
  20. @Override
  21. public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  22. System.out.println("do something before");
  23. // result 是返回结果
  24. Object result = methodProxy.invokeSuper(obj, objects);
  25. System.out.println("do something after");
  26. return result;
  27. }
  28. }

测试

  1. package top.simba1949.cglib;
  2. import net.sf.cglib.proxy.Enhancer;
  3. /**
  4. * @author Anthony
  5. * @date 2020/11/17 16:15
  6. */
  7. public class CglibApp {
  8. public static void main(String[] args) {
  9. // 通过CGLIB动态代理获取代理对象的过程
  10. Enhancer enhancer = new Enhancer();
  11. // 设置enhancer对象的父类
  12. enhancer.setSuperclass(SubjectService.class);
  13. // 设置enhancer的回调对象
  14. enhancer.setCallback(new CglibMethodInterceptor());
  15. // 创建代理对象
  16. SubjectService proxy = (SubjectService)enhancer.create();
  17. // 通过代理对象调用目标方法
  18. String result = proxy.doSomething("INFO");
  19. System.out.println("MAIN METHOD " + result);
  20. }
  21. }

javassist 动态代理

引入 javassist 依赖包

  1. <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
  2. <dependency>
  3. <groupId>org.javassist</groupId>
  4. <artifactId>javassist</artifactId>
  5. <version>3.27.0-GA</version>
  6. </dependency>

SubjectService 被代理类

  1. package top.simba1949.javassist;
  2. /**
  3. * @author Anthony
  4. * @date 2020/11/17 17:12
  5. */
  6. public class SubjectService {
  7. public String doSomething(String info){
  8. System.out.println("SubjectService:doSomething:" + info);
  9. return "SUCCESS";
  10. }
  11. }

代理处理类

  1. package top.simba1949.javassist;
  2. import javassist.util.proxy.MethodHandler;
  3. import java.lang.reflect.Method;
  4. /**
  5. * @author Anthony
  6. * @date 2020/11/17 17:11
  7. */
  8. public class JavassistMethodHandler implements MethodHandler {
  9. /**
  10. *
  11. * @param self 代理类的实例
  12. * @param thisMethod 表示被拦截的方法
  13. * @param proceed 表示要触发父类的方法对象
  14. * @param args 表示被拦截方法的参数;
  15. * @return
  16. * @throws Throwable
  17. */
  18. @Override
  19. public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
  20. System.out.println("do something before");
  21. Object result = proceed.invoke(self, args);
  22. System.out.println("do something after");
  23. return result;
  24. }
  25. }

测试

  1. package top.simba1949.javassist;
  2. import javassist.util.proxy.ProxyFactory;
  3. import javassist.util.proxy.ProxyObject;
  4. /**
  5. * @author Anthony
  6. * @date 2020/11/17 17:05
  7. */
  8. public class App {
  9. public static void main(String[] args) throws IllegalAccessException, InstantiationException {
  10. // 创建代理工厂
  11. ProxyFactory proxyFactory = new ProxyFactory();
  12. // 设置代理类的父类,也是被代理类
  13. proxyFactory.setSuperclass(SubjectService.class);
  14. // 生成动态代理类
  15. Class<?> aClass = proxyFactory.createClass();
  16. // 创建动态代理类的实例
  17. Object proxyInstance = aClass.newInstance();
  18. // 设置动态处理方式
  19. JavassistMethodHandler javassistMethodHandler = new JavassistMethodHandler();
  20. ((ProxyObject)proxyInstance).setHandler(javassistMethodHandler);
  21. // 执行代理方法
  22. String result = ((SubjectService) proxyInstance).doSomething("INFO");
  23. System.out.println("MAIN METHOD" + result);
  24. }
  25. }