cglib动态代理实现
cglib动态代理也是一种常用的实现,与jdk动态代理相比有许多不同之处, cglib通过继承目标类,生成子类作为代理。它无需接口,直接覆盖父类方法进行增强,因此无法代理final类或final方法。下面是一个简单的实现案例。
1.目标类
static class Target{public void foo(){System.out.println("target foo");}}目标类是一个类而非对象,而且方法和类上都不能用final修饰。
2.代理类创建
Target proxy = (Target)Enhancer.create(Target.class, (MethodInterceptor) (p, method, args, methodProxy) -> {System.out.println("before...");Object invoke = method.invoke(target, args);System.out.println("after...");return invoke;});代理类的创建是通过Enhancer对象创建,其中需要传入两个参数,一个是目标对象,另一个是MethodInterceptor对象。该对象是Callback对象的子类。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.cglib.proxy;import java.lang.reflect.Method;public interface MethodInterceptor extends Callback {Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
}
MethodInterceptor对象的创建需传入四个参数,第一个是代理对象,第二个是Method,第三个是args方法参数,第四个是MethodProxy代理对象,与第一个参数有所不同。整体方法调用代码如下:
package com.example.demo2;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/26 17:21*/
public class CglibProxyDemo {static class Target{public void foo(){System.out.println("target foo");}}public static void main(String[] param){Target target = new Target();Target proxy = (Target)Enhancer.create(Target.class, (MethodInterceptor) (p, method, args, methodProxy) -> {System.out.println("before...");Object invoke = method.invoke(target, args);System.out.println("after...");return invoke;});proxy.foo();}
}
输出结果:

3.目标类的调用的三种方式
Object invoke = method.invoke(target, args);这是一种通过反射的方式调用目标类的方法,除此之外还有别的方法可以使用,一般来说反射调用都会影响性能。下面的方法可以不用反射调用目标方法。使用了methodProxy代理调用。
Object invoke = methodProxy.invoke(target, args);结果如下:

methodProxy代理调用的另一种实现方式可以不用传入目标对象,代理的是本身,如下所示:
Object invoke = methodProxy.invokeSuper(p, args);同样达到了一样的效果:

