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("proxy before...");
Object result = methodProxy.invoke(target, args);//用方法反射调用目标
// 另一种调用方法,不需要目标对象实例
//methodProxy 它可以避免反射调用
// Object result = methodProxy.invokeSuper(p, args);//内部没有反射,需要代理
System.out.println("proxy after...");
return result;
});
// 调用代理
proxy.foo();
}
}
运行结果与 jdk 动态代理相同
收获💡
-
cglib 不要求目标实现接口,它生成的代理类是目标的子类,因此代理与目标之间是子父关系
-
限制⛔:根据上述分析 final 类无法被 cglib 增强
学到了什么: 代理一点都不难, 无非就是利用了多态、反射的知识
1. 方法重写可以增强逻辑, 只不过这【增强逻辑】千变万化, 不能写死在代理内部
2. 通过接口回调将【增强逻辑】置于代理类之外
3. 配合接口方法反射(也是多态), 就可以再联动调用目标方法