一、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禮包絕跡無關。
原創文章,作者:SQAUA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/330744.html