API介绍
- jar:已经被整合进了spring-context包中
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4d4e66e70b8f332989163d2adf906989.png)
- 相关类:org.springframework.cglib.proxy.Enhancer
生成代理对象的要求
生成代理对象的方法
Enhancer.create(Class superClass, Callback callback)
- superClass:目标对象的字节码
- callback:回调函数,用于写代理对象要做的事情,通常写成MethodInterceptor的匿名内部类对象
callback相当于jdk动态代理中的InvocationHandler
简单案例
public class MyCar {
public void run(){
System.out.println("时速50km/h");
}
}
public static void main(String[] args) {
MyCar car=new MyCar();//目标对象
MyCar adviceCar = (MyCar) Enhancer.create(car.getClass(), new MethodInterceptor() { //返回一个增强对象(代理对象,目标类的子类)
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("装上尾翼");
System.out.println("喷漆");
// Object invoke = method.invoke(car, args);
Object o1 = methodProxy.invokeSuper(o, args);
return o1;
}
});
adviceCar.run();
}
- 解析代码
- cat.getClass():目标类的字节码
- new MethodInterceptor():接口继承了Callback接口,匿名内部写增强方法或代码
- Object o :代理对象
- Method method:目标方法,通过反射调用
- Object[] objects:方法所需要的参数
- MethodProxy methodProxy:方法代理
- Object invoke:返回的是MyCar目标对象的子类,强转成MyCar类型
- adviceCar.run():调用已经增强的方法
- methodProxy.invokeSuper(o, args):不是通过反射进行方法调用,而是代理对象通过调用父类的方法(效率比反射高一些)