10_Spring_CGLIB动态代理

10_Spring_CGLIB动态代理

proxy 动态代理

面向接口

1必须有接口和实现类

2增强接口中定义的方法

3只能读取接口中方法的上注解

cglib动态代理模式

面向父类

image

  1. package com.msb.testCglib;
  2. import org.junit.Test;
  3. import org.springframework.cglib.proxy.Enhancer;
  4. import org.springframework.cglib.proxy.MethodInterceptor;
  5. import org.springframework.cglib.proxy.MethodProxy;
  6. import java.lang.reflect.Method;
  7. /**
    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  8. */
  9. public class Test1 {
  10. @Test
  11. public void testCglib(){
  12. Person person =new Person();
  13. // 获取一个Person的代理对象
  14. // 1 获得一个Enhancer对象
  15. Enhancer enhancer=new Enhancer();
  16. // 2 设置父类字节码
  17. enhancer.setSuperclass(person.getClass());
  18. // 3 获取MethodIntercepter对象 用于定义增强规则
  19. MethodInterceptor methodInterceptor=new MethodInterceptor() {
  20. @Override
  21. public Object intercept(Object o, Method method, Object[]
    objects, MethodProxy methodProxy) throws Throwable {
  22. /*Object o, 生成之后的代理对象 personProxy
  23. Method method, 父类中原本要执行的方法 Person>>> eat()
  24. Object[] objects, 方法在调用时传入的实参数组
  25. MethodProxy methodProxy 子类中重写父类的方法 personProxy >>> eat()
  26. */
  27. Object res =null;
  28. if(method.getName().equals("eat")){
  29. // 如果是eat方法 则增强并运行
  30. System.out.println("饭前洗手");
  31. res=methodProxy.invokeSuper(o,objects);
  32. System.out.println("饭后刷碗");
  33. }else{
  34. // 如果是其他方法 不增强运行
  35. res=methodProxy.invokeSuper(o,objects); //
    子类对象方法在执行,默认会调用父类对应被重写的方法
  36. }
  37. return res;
  38. }
  39. };
  40. // 4 设置methodInterceptor
  41. enhancer.setCallback(methodInterceptor);
  42. // 5 获得代理对象
  43. Person personProxy = (Person)enhancer.create();
  44. // 6 使用代理对象完成功能
  45. personProxy.eat("包子");
  46. }
  47. }
  48. class Person {
  49. public Person( ) {
  50. }
  51. public void eat(String foodName) {
  52. System.out.println("张三正在吃"+foodName);
  53. }
  54. }

Generated with Mybase Desktop 8.2.13

posted @ 2023-07-30 12:38  AidenDong  阅读(35)  评论(0)    收藏  举报