新闻资讯

新闻资讯 媒体报道

Spring_动态代理CGLIB

编辑:016     时间:2021-11-08
  • 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 enhancer = new Enhancer(); //设置Enhancer对象的父类是指定类型CoffeeImpl 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); //后置增强内容,与JDKProxy区别:JDKProxy仅对接口方法做增强,cglib对所有方法做增强,包括Object类中的方法 if(method.getName().equals("kafei")) { System.out.println("添加了糖"); System.out.println("添加了牛奶"); } return ret; } }); //使用Enhancer对象创建对应的对象 return (Coffee) enhancer.create(); }

4、测试

public class Test { public static void main(String[] args) { Coffee coffee= CglibProxy.createCglibProxy(CoffeeImpl.class); coffee.kafei(); }}
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐