CGLIB學習札記 生成CLASS的命名規則

2021-08-27 17:46:12 字數 1855 閱讀 1015

cglib生存的class的命名規則有多種,它們都是由介面namingpolicy對應的實現來定義的.接下來針對defaultnamingpolicy進行分析.泛泛的說,生成的class的規則如下

被**class name(包名和類名) + "$$" +

使用cglib處理的class name(只有類名,不包含包名) +"bycglib" + "$$" +

key的hashcode(接下來會對key有乙個詳細的分析) +

序列號下面是上面規則的示例:

aop.target.helloimpl$$enhancerbycglib$$494b5b61

aop.target.helloimpl$$enhancerbycglib$$494b5b61_2

aop.target.helloimpl$$enhancerbycglib$$494b5b61_3

下面是對應的關鍵**

#defaultnamingpolicy

public string getclassname(string prefix, string source, object key, predicate names)

return attempt;

}

key 是什麼?

上面的生成規則有4個引數,其中key是乙個不太好理解的引數

key是乙個物件,該物件封裝了下面7個資訊. 並且這個key物件是由cglib生成的乙個類來建立出來的.

1:superclass

2:inte***ces

3:filter

4:callbacktypes

5:serialversionuid

6:usefactory, 

7:interceptduringconstruction

下面的**是生成key的介面定義,以及cglib如何生成此介面的例項

public inte***ce enhancerkey

//enhancer cglib會動態生成乙個介面(enhancerkey)的位元組碼並例項化,接下來將試用此物件生成key來封裝上面提到的幾個引數

private static final enhancerkey key_factory =

(enhancerkey)keyfactory.create(enhancerkey.class);

為什麼有序列號的存在?

通常預設情況是,相同的classload,相同的key只生成乙個只生成一次子類並快取,也就是在defaultnamingpolicy,沒有發現有序列號存在的可能. 序列號應該是在別的場景中使用. 下面是生成的子類是如何通過hashset快取起來的:

protected object create(object key)  else if (usecache) 

if (gen == null) catch (classnotfoundexception e)

}if (gen == null)

if (usecache)

return firstinstance(gen);

} finally }}

return firstinstance(gen);

} catch (runtimeexception e) catch (error e) catch (exception e)

}

接下來準備,繼續寫乙個博文介紹下面3點

1)cglib如何生成的class的二進位制檔案

2)cglib生成的class二進位制(byte)放哪

3)cglib如何把二進位制load生成的class

Python學習札記

1 strip 去除字串中所有不想要的空白符,split 方法建立乙個列表。2 sorted bif支援複製排序。3 分片,列表推導 4 工廠函式去除掉裡列表中重複的項。5 定義乙個類時,實際上是在定義乙個定製工廠函式。6 使用dict 工廠函式或使用 可以建立乙個空字典。要訪問乙個person字典...

學習Tomcat動態載入JSP的Class類

今天在修改專案乙個jsp檔案時,突然想到tomat是怎麼實現動態實時載入jsp編譯後的class類的?具體原理我將單獨總結一下,這裡簡單實現了動態載入類 1.定義服務類 public class servlet 2.定義服務執行緒 public class servicethread extends...

C 學習札記20140312

謹記,但凡使用了迭代器的迴圈體,都不要向迭代器所屬的容器新增元素!vector物件可以動態增長,但不能應用在範圍for的語句中對vector物件增加元素,還有任何改變vector物件容量的操作都會使得該物件的迭代器失效!不能解引用迭代器的end成員所指向的元素,因為end是指向迭代器的尾後,解引用就...