package com.example.springdemo.A012; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; public class CglibProxyDemo { static class Target{ public void foo(){ System.out.println("target foo"); } } public static void main(String[] args) { Target target = new Target(); Target proxy = (Target) Enhancer.create(Target.class,(MethodInterceptor) (p, method, param, methodProxy)->{
System.out.println("before"); //Object result = method.invoke(target, param);//用反射 //Object result = methodProxy.invoke(target, param);//内部无反射,需要目标(spring用的是这种) Object result = methodProxy.invoke(target, param);//内部无反射,需要代理 System.out.println("after"); return result;
}); proxy.foo(); } } 代理类是子类,目标类是父类,是子父关系。目标类不能用final修饰,因为一旦使用final类修饰,代理类就无法成为目标类的子类。目标类的方法也不能是final的,因为子类通过重写父类方法达到增强的目的,无法重写,即无法增强。