概述:
cglib代理,就是运行时期对目标对象生成子类实现的代理:
- 要求目标对象不能为final,否则报错。
- 如果目标对象方法为final/static, 运行不报错,但不会被代理拦截,会直接调用目标对象的方法。
- cglib代理使用场景
- 目标有实现接口,最好使用jdk代理。
- 目标对象没有实现接口,最好使用cglib代理。
- cglib代理
- 可以应用于目标对象没有实现接口
- 目标对象有实现接口,也可以使用cglib代理。
案例:
需求:在运行时期,动态生成目标对象的子类。
分析:
- 需要引入cglib支持包,spring-core核心包中已经包含了cglib的功能。所以引入spring-core就可以
- 目标对象不实现接口(可选)
- 测试
实现代码:package com.itheima.proxy.c_dynamic_cglib; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class App { public static void main(String[] args) { //1. 目标对象 LiuDeHuaStar target = new LiuDeHuaStar(); //2. 对目标对象生成代理(生成子类) LiuDeHuaStar proxy = (LiuDeHuaStar) Enhancer.create(LiuDeHuaStar.class, new MethodInterceptor() { @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { // 获取方法参数 Double money = (Double) args[0]; // 判断 if (money > 1000000){ // 执行目标对象的方法 return method.invoke(target,args); } else { System.out.println("档期忙,以后再合作!"); } return null; } }); // 查看生成的代理对象:class com..LiuDeHuaStar$$EnhancerByCGLIB$$151241e7 System.out.println("查看生成的代理对象:" + proxy.getClass()); //3. 访问代理方法 proxy.act(1d); proxy.act(1000001d); } }
谢谢阅读!