ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### cglib动态代理 核心思想:CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类\(CGLib底层是通过继承实现的动态代理\),并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础;底层:使用一个小而快的字节码处理框架ASM\(Java字节码操控框架\),来转换字节码并生成新的类 缺点:不能代理final修饰的类 示例代码: ``` //被代理的类即目标对象 public class A { public void execute(){ System.out.println("执行A的execute方法..."); } } //代理类 public class CGLibProxy implements MethodInterceptor { /** * 被代理的目标类 */ private A target; public CGLibProxy(A target) { super(); this.target = target; } /** * 创建代理对象 * @return */ public A createProxy(){ // 使用CGLIB生成代理: // 1.声明增强类实例,用于生产代理类 Enhancer enhancer = new Enhancer(); // 2.设置被代理类字节码,CGLIB根据字节码生成被代理类的子类 enhancer.setSuperclass(target.getClass()); // 3.//设置回调函数,即一个方法拦截 enhancer.setCallback(this); // 4.创建代理: return (A) enhancer.create(); } /** * 回调函数 * @param proxy 代理对象 * @param method 委托类方法 * @param args 方法参数 * @param methodProxy 每个被代理的方法都对应一个MethodProxy对象, * methodProxy.invokeSuper方法最终调用委托类(目标类)的原始方法 * @return * @throws Throwable */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //过滤不需要该业务的方法 if("execute".equals(method.getName())) { //调用前验证权限(动态添加其他要执行业务) AuthCheck.authCheck(); //调用目标对象的方法(执行A对象即被代理对象的execute方法) Object result = methodProxy.invokeSuper(proxy, args); //记录日志数据(动态添加其他要执行业务) Report.recordLog(); return result; }else if("delete".equals(method.getName())){ //..... return methodProxy.invokeSuper(proxy, args); } //如果不需要增强直接执行原方法 return methodProxy.invokeSuper(proxy, args); } } ```