-
CGLIB(Code Generation Library),Code生成类库
-
CGLIB动态代理不限定是否具有接口,可以对任意操作进行增强
-
CGLIB动态代理无需要原始被代理对象,动态创建出新的代理对象
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能使用JDK的动态代理,cglib是针对类来实现代理的,它的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但 因为采用的是继承,所以不能对final修饰的类进行代理。
代码实现:
1、目标对象的接口
public interface Coffee { void kafei();}
2、目标对象的接口的实现类
public class CoffeeImpl implements Coffee { @Override public void kafei() { System.out.println("点了杯咖啡"); }}
3、创建jdkproxy代理类
import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;public class CglibProxy { public static Coffee createCglibProxy(Class clazz){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object ret = methodProxy.invokeSuper(o, args); if(method.getName().equals("kafei")) { System.out.println("添加了糖"); System.out.println("添加了牛奶"); } return ret; } }); return (Coffee) enhancer.create(); }
4、测试
public class Test { public static void main(String[] args) { Coffee coffee= CglibProxy.createCglibProxy(CoffeeImpl.class); coffee.kafei(); }}
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。