您的位置:

CGlib: 动态代理之王

一、cglib可以代理接口吗

答案是不能。

CGlib是针对类来实现代理的,它的原理是通过字节码处理框架ASM来转换字节码并生成新的类。

二、cglib需要接口来做代理吗

答案是不需要。

相比于JDK的动态代理,CGlib无需被代理对象实现接口,动态生成的子类重写父类的方法,因此可以代理没有实现任何接口的类。

三、cglib全称

CGlib全称是Code Generation Library,是一个强大的高性能代码生成类库,它可以在运行期扩展Java类与实现Java接口。

四、cglib和jdk代理的区别

CGlib相对于JDK动态代理的优势是:

1. CGlib可以代理没有接口实现的类

2. CGlib基于ASM字节码处理库,运行时代理速度快

3. JDK动态代理是基于接口的,所以只能代理接口的方法,无法代理对象的属性,而CGlib是代理类的方法,可以代理类的属性,实现代理类的继承

4. JDK动态代理由于是使用反射机制来执行被代理对象的方法,所以在高并发的情况下性能受到影响,而CGlib通过生成字节码的方式来实现动态代码的执行,所以性能更好一些。

五、cglib怎么读

CGlib的英文全称是 Code Generation Library,中文名是基因代码库。

CGlib读作:[si: dʒi:l'ɪb]。

六、cglib动态代理


public class UserDao {
    public void save(){
        System.out.println("----已经保存数据----");
    }
}

public class CglibProxy implements MethodInterceptor {
    private Object target;
    public Object getInstance(Object target){
        this.target=target;
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("执行前。。。。。。。。。。");
        Object obj=method.invoke(target,objects);
        System.out.println("执行后。。。。。。。。。。");
        return obj;
    }
}

public class TestCglib {
    public static void main(String[] args) {
        UserDao userDao=new UserDao();
        CglibProxy cglibProxy=new CglibProxy();
        UserDao proxy = (UserDao) cglibProxy.getInstance(userDao);
        proxy.save();
    }
}

七、cglib 代理

CGlib代理的基本步骤如下:

1. 继承需要被代理的类

2. 重写需要被拦截的方法,实现增强逻辑

3. 在需要使用代理的地方,使用代理类代理原有类

八、cglib代理属性

CGlib代理类可以拦截方法以及属性,使用起来也非常的灵活。

九、cglib创建对象


// 创建类
Enhancer enhancer = new Enhancer();
// 为该类设置父类
enhancer.setSuperclass(MyClass.class);
// 设置回调接口对象
enhancer.setCallback(new MyInterceptor());
// 创建子类实例
MyClass myClass = (MyClass) enhancer.create();

十、cg礼包绝迹是什么

本文讲解的CGlib与cg礼包绝迹无关。