10_Spring_CGLIB动态代理
10_Spring_CGLIB动态代理
proxy 动态代理
面向接口
1必须有接口和实现类
2增强接口中定义的方法
3只能读取接口中方法的上注解
cglib动态代理模式
面向父类
- package com.msb.testCglib;
- import org.junit.Test;
- import org.springframework.cglib.proxy.Enhancer;
- import org.springframework.cglib.proxy.MethodInterceptor;
- import org.springframework.cglib.proxy.MethodProxy;
- import java.lang.reflect.Method;
- /**
-
- @Author: Ma HaiYang
-
- @Description: MircoMessage:Mark_7001
- */
- public class Test1 {
-
@Test -
public void testCglib(){ -
Person person =new Person(); -
// 获取一个Person的代理对象 -
// 1 获得一个Enhancer对象 -
Enhancer enhancer=new Enhancer(); -
// 2 设置父类字节码 -
enhancer.setSuperclass(person.getClass()); -
// 3 获取MethodIntercepter对象 用于定义增强规则 -
MethodInterceptor methodInterceptor=new MethodInterceptor() { -
@Override -
objects, MethodProxy methodProxy) throws Throwable {public Object intercept(Object o, Method method, Object[] -
/*Object o, 生成之后的代理对象 personProxy -
Method method, 父类中原本要执行的方法 Person>>> eat() -
Object[] objects, 方法在调用时传入的实参数组 -
MethodProxy methodProxy 子类中重写父类的方法 personProxy >>> eat() -
*/ -
Object res =null; -
if(method.getName().equals("eat")){ -
// 如果是eat方法 则增强并运行 -
System.out.println("饭前洗手"); -
res=methodProxy.invokeSuper(o,objects); -
System.out.println("饭后刷碗"); -
}else{ -
// 如果是其他方法 不增强运行 -
子类对象方法在执行,默认会调用父类对应被重写的方法res=methodProxy.invokeSuper(o,objects); // -
} -
return res; -
} -
}; -
// 4 设置methodInterceptor -
enhancer.setCallback(methodInterceptor); -
// 5 获得代理对象 -
Person personProxy = (Person)enhancer.create(); -
// 6 使用代理对象完成功能 -
personProxy.eat("包子"); -
} - }
- class Person {
-
public Person( ) { -
} -
public void eat(String foodName) { -
System.out.println("张三正在吃"+foodName); -
} - }
Generated with Mybase Desktop 8.2.13

浙公网安备 33010602011771号