10_Spring_CGLIB动态代理

发布时间 2023-07-30 12:44:18作者: AidenDong

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