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
标签:10,Spring,Object,代理,Person,CGLIB,import,父类,eat From: https://www.cnblogs.com/01way/p/17591280.html