一、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礼包绝迹无关。